俄罗斯娃娃缓存

你可能希望将缓存的片段嵌套在其他缓存的片段中。这叫做 Russian doll caching

Russian doll caching 的优点是,如果更新单个产品,则在重新生成外部片段时可以重用所有其他内部片段。

如上一节所述,如果 updated_at 的值更改为缓存文件直接依赖的记录,则缓存文件将过期。但是,这不会使片段嵌套在其中的任何缓存到期。

例如,采用以下视图:

<% cache product do %>
  <%= render product.games %>
<% end %>

这反过来呈现这种观点:

<% cache game do %>
  <%= render game %>
<% end %>

如果游戏的任何属性改变,则 updated_at 值将被设置为当前时间,从而使缓存到期。

但是,由于产品对象不会更改 updated_at,因此该缓存不会过期,你的应用将提供陈旧数据。为了解决这个问题,我们将模型与触摸方法结合在一起:

class Product < ApplicationRecord
  has_many :games
end

class Game < ApplicationRecord
  belongs_to :product, touch: true
end