mar*_*cks 6 ruby-on-rails-3 russian-doll-caching
我在我的模型中设置了一个缓存
def self.latest(shop_id)
Inventory.where(:shop_id => shop_id).order(:updated_at).last
end
Run Code Online (Sandbox Code Playgroud)
在我看来
<% cache ['inventories', Inventory.latest(session[:shop_id])] do %>
<% @inventories.each do |inventory| %>
<% cache ['entry', inventory] do %>
<li><%= link_to inventory.item_name, inventory %></li>
Run Code Online (Sandbox Code Playgroud)
所以,在这里我可以有很多商店,每个商店都有库存商品库存.以上缓存是否适用于不同的商店?
我认为即使在不同的商店中显示视图也可能会破坏缓存.或者,任何添加库存项目的商店都会破坏缓存.
我可以像这样使用俄罗斯娃娃缓存,还是需要在我的模型中使用Inventory.all?
您的想法很接近,但您需要将每个商店的库存的、 和最大值shop_id包含到您的缓存键中。当商店的商品也被删除时,您的外部缓存也需要被破坏,并且这不属于最大或countupdated_atidupdated_at单独的范围。
您可以扩展自定义缓存键帮助器方法来实现此目的。这允许您创建独特的顶级缓存,只有当该集合的成员被添加、更新或删除时,这些缓存才会被破坏。实际上,这为每个提供了唯一的外部缓存shop_id. 因此,当一个商店的库存发生变化时,不会影响另一商店的缓存。
这是一个基于边缘导轨文档中的想法的示例:
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
Run Code Online (Sandbox Code Playgroud)
那么在你看来:
<% cache(cache_key_for_inventories(session[:shop_id])) do %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |