Rails 4.0.0.0使用belongs_to模型进行俄罗斯玩偶缓存

时间:2013-07-03 06:54:05

标签: ruby-on-rails-3 russian-doll-caching

我在我的模型中设置了一个缓存,如

def self.latest(shop_id)
    Inventory.where(:shop_id => shop_id).order(:updated_at).last
end

在我看来

<% cache ['inventories', Inventory.latest(session[:shop_id])] do %>

   <% @inventories.each do |inventory| %>

      <% cache ['entry', inventory] do %>     

     <li><%= link_to inventory.item_name, inventory %></li>

所以,在这里我可以有很多商店,每个商店都有库存商品库存。以上缓存是否适用于不同的商店?

我认为即使在不同的商店中显示视图也可能会破坏缓存。或者,任何添加库存项目的商店都会破坏缓存。

我可以像这样使用俄罗斯娃娃缓存,还是需要在我的模型中使用Inventory.all?

1 个答案:

答案 0 :(得分:3)

您的想法很接近,但您需要将每个商店广告资源的shop_idcountupdated_at加入您的缓存密钥。当商店的商品也被删除时,您的外部缓存需要被破坏,并且仅在最大idupdated_at下不包含。

您可以展开自定义缓存密钥帮助程序方法以使其工作。这允许您创建唯一的顶级缓存,只有在添加,更新或删除该集合的成员时才会被破坏。实际上,这为每个shop_id提供了唯一的外部缓存。因此,当一个商店的库存发生变化时,它不会影响另一个商店的缓存。

以下是一个示例,基于edge rails documentation

中的提示
module InventoriesHelper
  def cache_key_for_inventories(shop_id)
    count          = Inventory.where(:shop_id => shop_id).count
    max_updated_at = Inventory.where(:shop_id => shop_id).maximum(:updated_at).try(:utc).try(:to_s, :number)
    "inventories/#{shop_id}-#{count}-#{max_updated_at}"
  end
end

然后在你看来:

<% cache(cache_key_for_inventories(session[:shop_id])) do %>
  ...
<% end %>