2013-07-03 1 views
6

mi hanno creato una cache nel mio modello comeRails 4.0.0.0 bambola russa caching con il modello belongs_to

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

e, a mio avviso

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

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

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

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

Così, qui posso avere molti negozi, ognuno con un inventario di articoli in stock. La cache di cui sopra funziona a tutti i negozi?

Penso che sia possibile che anche la visualizzazione della visualizzazione in un negozio diverso interrompa la cache. Oppure, qualsiasi negozio che aggiunge un articolo di inventario romperà la cache.

Posso utilizzare la cache di Russian Doll in questo modo o devo utilizzare Inventory.all nel mio modello?

risposta

3

L'idea è vicina, ma è necessario includere lo shop_id, lo count e il massimo updated_at dell'inventario di ogni negozio nella chiave di cache. La cache esterna deve essere eliminata quando viene eliminato anche l'elemento di un negozio, che non è coperto da un massimo di id o updated_at.

È possibile espandere il metodo di supporto della chiave cache personalizzata per farlo funzionare. Ciò consente di creare cache di primo livello uniche che vengono arrestate solo quando un membro di tale serie viene aggiunto, aggiornato o eliminato. In effetti, questo fornisce una cache esterna univoca per ogni shop_id. Pertanto, quando l'inventario di un negozio viene modificato, non influisce sulla cache di un altro negozio.

Ecco un esempio, sulla base di idee nel 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 

Quindi secondo lei:

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