【问题标题】:rails 4 cache expiration not workingrails 4缓存过期不起作用
【发布时间】:2016-07-20 11:34:33
【问题描述】:

在我的 Rails 应用程序中,我尝试使用嵌套缓存,但是当 user.profile.full_name 更改时,我的缓存键不会过期。因此,当用户更改他/她的姓名时,_profile_product.html.erb 显示的全名仍然是旧的。

我应该如何更改密钥?

profiles/show.html.erb

<% cache(@profile) do %> #this is the profile info and the cache key expires properly when @profile.full_name changes
  <%= @profile.full_name %>
  .....
<% end %>
<% if @profile.user.products.any? %> #not nested in the previous cache; 
  #products belonging to the profile are listed with this code under the profile info
  <%= render 'products/profile_products' %>
<% end %>

_profile_products.html.erb

<% cache(['profile-products', @profile_products.map(&:id), @profile_products.map(&:updated_at).max]) do %>
  <%= render partial: "products/profile_product", collection: @profile_products, as: :product %>
<% end %>

_profile_product.html.erb

<% cache (['profile-product-single', product, product.user.profile]) do %>
  <%= product.name %>
  <%= product.user.profile.full_name %> #if I change profile name this one won't change thanks to the cache
<% end %>

【问题讨论】:

    标签: ruby-on-rails caching fragment-caching


    【解决方案1】:

    尝试更改缓存键

    _profile_products.html.erb

    <% cache(['profile-products', @profile_products.map(&:id), @profile_products.map(&:updated_at).max, @profile_products.map{|pp| pp.user.profile.updated_at.to_i }.max]) do %>
      <%= render partial: "products/profile_product", collection: @profile_products, as: :product %>
    <% end %>
    

    问题在于,当用户更新他们的个人资料名称时,包含整个列表的缓存片段不会过期。

    通过将关联用户配置文件的updated_at 的最大值添加到缓存键,缓存片段将在用户更新其配置文件时过期。

    【讨论】:

      猜你喜欢
      • 2013-07-01
      • 2021-05-09
      • 2015-08-24
      • 2011-11-08
      • 2015-12-25
      • 1970-01-01
      • 2018-05-01
      • 2011-08-19
      • 2011-02-25
      相关资源
      最近更新 更多