我目前正在测试我的应用中的缓存(Dalli gem)。并且发生了一件奇怪的事情。我正在缓存与current_user相关的列表。但是,当我使用不同的帐户(使用不同的浏览器)测试应用程序时,缓存是混合的。
例如:我运行一个更改User1缓存的操作,这些缓存应用于User2的帐户。
所以我想知道这个问题是否发生只是因为我在同一台计算机上进行开发,或者我是否应该改进我的缓存系统?
注意:我已跳过摘要以使其有效,我不确定他们的需求。所以我不确定这是否可以成为我问题的起点。
如果您想了解我正在做的事情的详细信息,我会分享我的代码。
我的代码:
用户(型号):
class User < ApplicationRecord
has_many :users_group, dependent: :destroy
has_many :groups, through: :users_group
has_many :favorit_groups, dependent: :destroy
has_many :fav_groups, through: :favorit_groups, class_name: "Group", source: :group
def cached_favgroups
Rails.cache.fetch([self, "fav_groups"]) {fav_groups.to_a}
end
def cached_groups
Rails.cache.fetch([self, "groups"]) {groups.to_a}
end
查看(sidenav):
<li class="list_groups_favorit">
<% cache 'cache_groups_fav_all', skip_digest: true do %>
<% current_user.cached_favgroups.each do |group| %>
<% cache group, skip_digest: true do %>
<%= render 'groups/group', group: group%>
<% end %>
<% end %>
<% end %>
</li>
<li class="list_groups">
<% cache 'cache_groups_all', skip_digest: true do %>
<% current_user.cached_groups.each do |group| %>
<% cache group, skip_digest: true do %>
<%= render 'groups/group', group: group%>
<% end %>
<% end %>
<% end %>
</li>
GroupController:
def favorit
FavoritGroup.where(group_id: @group.id).where(user_id: current_user.id).first_or_create
# Cache
Rails.cache.delete(current_user.cache_key+"/fav_groups")
Rails.cache.delete(current_user.cache_key+"/groups")
expire_fragment('cache_groups_fav_all')
expire_fragment('cache_groups_all')
expire_fragment(@group)
# Cache
respond_to do |format|
format.html { redirect_back }
format.js { render 'groups/js/favorit' }
end
end
def unfavorit
FavoritGroup.where(group_id: @group.id).where(user_id: current_user.id).delete_all
# Cache
Rails.cache.delete(current_user.cache_key+"/fav_groups")
Rails.cache.delete(current_user.cache_key+"/groups")
expire_fragment('cache_groups_fav_all')
expire_fragment('cache_groups_all')
expire_fragment(@group)
# Cache
respond_to do |format|
format.html { redirect_back }
format.js { render 'groups/js/unfavorit' }
end
end