2013-07-03 12 views
6

के साथ रूसी गुड़िया कैशिंग मैं एक कैश अपने मॉडल मेंरेल 4.0.0.0 belongs_to मॉडल

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> 

तो, यहाँ मैं कई दुकानों हो सकता है प्रत्येक स्टॉक आइटम की एक सूची के साथ। उपरोक्त कैश अलग-अलग दुकानों के लिए बिल्कुल काम करेगा?

मुझे लगता है कि यह संभव है कि एक अलग दुकान में दृश्य को प्रदर्शित करने से कैश टूट जाएगा। या, एक सूची आइटम जोड़ने वाली कोई भी दुकान कैश तोड़ देगी।

क्या मैं इस तरह रूसी गुड़िया कैशिंग का उपयोग कर सकता हूं या क्या मुझे अपने मॉडल में इन्वेंटरी.ल का उपयोग करने की ज़रूरत है?

उत्तर

3

आपका विचार करीब है, लेकिन आपको shop_id, count, और प्रत्येक कैश कुंजी में प्रत्येक दुकान की सूची का अधिकतम updated_at शामिल करना होगा। जब किसी दुकान की वस्तु भी हटा दी जाती है तो आपके बाहरी कैश को बस्ट करने की आवश्यकता होती है, और यह अधिकतम id या updated_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 %> 

यहाँ एक उदाहरण edge rails documentation में विचारों के आधार पर है,

संबंधित मुद्दे