2009-12-04 85 views
0

我有幾個模型包含靜態數據,我試圖緩存它們。我已經閱讀了關於緩存的各種指南和railscasts,並認爲它很簡單,但仍然無法弄清楚。例如,我有以下型號如何在rails中創建靜態模型的簡單緩存?

class ActionType < ActiveRecord::Base 

    def self.find(id) 
    Rails.cache.fetch(cache_key) { ActionType.find(id) } 
    end 

end 

但是,這是建立以下錯誤:

wrong number of arguments (2 for 1) 

與以下堆棧跟蹤

C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find' 
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `send' 
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find_target' 
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:240:in `load_target' 
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:112:in `reload' 
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations.rb:1219:in `action_type' 

我最近升級到Rails 2.3。 3(從2.0.1開始)利用更新版本中內置的緩存內容。

此外,大多數這些模型都是帶有id和說明的簡單參考表。然而,我們有30列和100多行,但仍然是真正靜態的數據,如果可能,我想緩存。所有這30列除布爾值和小整數外(最後一列是一個短字符串),所以它不應占用太多內存。

回答

2

這裏的一個問題是試圖覆蓋ActiveRecordfind方法。我可能會創建一個名爲find_cached的類方法。

那樣,你的cache_key變量從哪裏來?考慮只使用ID,像

class ActionType < ActiveRecord::Base 

    def self.find_cached(id) 
    Rails.cache.fetch("action_type_cache/#{id}") { ActionType.find(id) } 
    end 

end 
+0

我讀到,cache_key是一種方法添加到軌道2.1到ActiveRecord :: Base進行緩存。我嘗試覆蓋find方法,以便爲與ActionType有關係的其他模型自動調用緩存而不是SQL加載。 – user26270 2009-12-04 15:21:37

+0

是的,但cache_key是一個實例方法,而不是一個類方法。所以每個ActiveRecord對象都有一個cache_key,但它對於類的存在沒有意義。 – Ben 2009-12-04 15:55:51

+0

我用你的代碼和它的工作,除了它仍然對ActionType的列進行查詢。所以我將它改爲ActionType.find(id,:select =>「id,desc」),並且拋出另一個錯誤,說SQL不正確;非常奇怪 – user26270 2009-12-04 16:07:37