Кеш в производстве
В настоящее время я тестирую кеши в моем приложении (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
Вид (сиденав):
<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