6

次のようにモデルにキャッシュを設定しました

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 を使用する必要がありますか?

4

1 に答える 1

3

あなたのアイデアは近いですが、各ショップの在庫のshop_idcount、および最大値をキャッシュ キーに含める必要があります。ショップのアイテムが削除された場合も外側のキャッシュを破棄する必要がありますが、これは上限または単独updated_atではカバーされません。idupdated_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

次に、あなたの見解で:

<% cache(cache_key_for_inventories(session[:shop_id])) do %>
  ...
<% end %>
于 2013-07-23T22:19:28.067 に答える