2013-07-03 4 views
6

Ich habe einen Cache in meinem Modell wieRails 4.0.0.0 Russian Doll Caching mit belongs_to Modell

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

und meiner Ansicht einrichten

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

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

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

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

So, hier kann ich viele Geschäfte haben, jeweils mit einem Lagerbestand von Lagerartikeln. Funktioniert der obige Cache überhaupt für verschiedene Shops?

Ich denke, es ist möglich, dass sogar die Anzeige der Ansicht in einem anderen Shop den Cache unterbricht. Oder jeder Shop, der ein Inventarelement hinzufügt, unterbricht den Cache.

Kann ich Russian Doll Caching so verwenden oder muss ich Inventory.all in meinem Modell verwenden?

Antwort

3

Ihre Idee ist nah, aber Sie müssen die shop_id, die count und die maximale updated_at des Inventars jedes Shops in Ihren Cache-Schlüssel einschließen. Ihr äußerer Cache muss gelöscht werden, wenn ein Shop-Artikel ebenfalls gelöscht wird, und das ist nicht unter einer maximalen id oder updated_at allein abgedeckt.

Sie können Ihre benutzerdefinierte Cache-Schlüssel-Hilfsmethode erweitern, damit dies funktioniert. Dies ermöglicht es Ihnen, einzigartige Top-Level-Caches zu erstellen, die nur dann übersprungen werden, wenn ein Mitglied dieses Sets hinzugefügt, aktualisiert oder gelöscht wird. In der Tat ergibt dies einen eindeutigen äußeren Cache für jede shop_id. Wenn also das Inventar eines Shops geändert wird, wirkt sich dies nicht auf den Cache eines anderen Shops aus. Hier

ist ein Beispiel, basierend auf Ideen im 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 

Dann Ihrer Ansicht nach:

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