2012-06-26 17 views
5

उदाहरण के लिए मैं अपने सूचकांक नियंत्रक में इस राशिक्या कॉल को कैश करने का कोई तरीका है?

@users = User.current 

यह मेरा उपयोगकर्ता मॉडल

scope :current, :conditions => { :active => true }, :order => 'LOWER(first_name), LOWER(last_name) ASC' 

कौन सा मूल रूप से सभी रिकॉर्ड हथियाने है और मैं paginating नहीं कर रहा हूँ क्योंकि मैं jQuery datatables तालिका का उपयोग कर रहा जिसमें एक बड़ी फ़िल्टर खोज है ... जिस समस्या को मैं हासिल करना चाहता हूं, वह तब तक कैश करना है जब तक कि नए उपयोगकर्ता न हों ... जो अक्सर नहीं होता है

मैंने fresh_when के बारे में पढ़ा लेकिन पता नहीं था कि क्या हो सकता है यहाँ

अद्यतन

इस्तेमाल किया जवाब पालन करने के बाद नीचे मुझे नहीं लॉग में कैश सभी देखें मैं देख रहा है

Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `positions` ON `companies`.`id` = `positions`.`company_id` WHERE `positions`.`user_id` = 551 
    Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `positions` ON `companies`.`id` = `positions`.`company_id` WHERE `positions`.`user_id` = 93 
    Company Load (0.4ms) SELECT `companies`.* FROM `companies` INNER JOIN `positions` ON `companies`.`id` = `positions`.`company_id` WHERE `positions`.`user_id` = 668 
+0

आपके डीबी में आपके कितने उपयोगकर्ता हैं? –

+0

600 उपयोगकर्ता डीबी – Trace

+0

में हैं क्या आपको कभी इसका समाधान मिला है? मुझे भी वही समस्या हो रही है? :( –

उत्तर

6
class User < ActiveRecord::Base 
    after_save :clear_cache 

    def self.current 
    Rails.cache.fetch("current_users", expires_in: 1.hour) do 
     User.where(active: true).order("LOWER(first_name), LOWER(last_name) ASC").all 
    end 
    end 

private 

    def clear_cache 
    Rails.cache.delete("current_users") 
    end 

end 

कि कैशिंग सुनिश्चित करें config/वातावरण में सक्षम किया गया है/* । आरबी:

config.action_controller.perform_caching = true 

यह वही है जो आप w चींटी। यहां अधिक पढ़ें:
http://robotmay.com/post/23161612605/everyone-should-be-using-low-level-caching?bda26d48
http://www.tmatthew.net/blog/rails-caching-example
http://api.rubyonrails.org/classes/ActiveSupport/Cache/Store.html#method-i-fetch

जब कैश में मॉडल भंडारण, आप एक अजीब समस्या तब होती है कि जब कैश लाए जाने से पहले मॉडल लोड किए गए हैं में चला सकते हैं। चिंता न करें, यह केवल विकास में क्या होगा, और वहाँ एक ठीक (application_controller.rb) है:

before_filter :load_models_if_dev 
def load_models_if_dev 
    if Rails.env == 'development' 
     User; Post; Comment # whatever other classes that can get cached. 
    end 
end 

अद्यतन
सूचना User.where().order().all में .all। इसके बिना, कैश में संग्रहीत मान केवल एक ActiveRecord संबंध है, न कि वास्तविक परिणाम। बिना किसी क्वेरी को अभी भी चलाना होगा। हमारे ध्यान में लाने के लिए धन्यवाद @ फ्रेडरिक चेंग।

+0

आपका समाधान बहुत अच्छा लगता है, लेकिन जब मैं लॉग देखता हूं तो मुझे कैश नहीं दिखाई देता है, मैं हर बार सादा एसक्यूएल देखता हूं ... मैं अपना प्रश्न – Trace

+0

ओह हाँ अपडेट करूंगा ... कैशिंग को डिफ़ॉल्ट रूप से विकास में अक्षम कर दिया गया है ... संपादित करें देखें – tybro0103

+0

एक आरक्षण - रेल डिफ़ॉल्ट रूप से 'फाइलस्टोर' का उपयोग मार्शल/अनमारशाल के साथ कर सकते हैं जो प्रत्यक्ष एसक्यूएल (स्थानीय डिस्क पर निर्भर करता है) से धीमा हो सकता है, यह डिफ़ॉल्ट रूप से R3.2 –

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