2010-02-25 38 views
2

我有一個Rails 2.3.4應用程序,看起來像一條線:Rails.cache.fetch,符號,和Memcached的

temp = Rails.cache.fetch(:temp_id) { User.find_by_name('Temp').id } 

,一切工作正常,直到我決定換緩存層的memcached通過添加以下到我的environment.rb:

config.cache_store = :mem_cache_store 

現在它用來做工精細的線條給我下面的錯誤:

undefined method 'length' for :temp_id:Symbol   

/usr/local/lib/ruby/gems/1.8/gems/activesupport-2.3.4/lib/active_support/vendor/memcache-client-1.7.4/memcache.rb:645:in 'get_server_for_key'

我明白這個錯誤,但我會想象這個常見的情況會很快被rails測試用例發現,所以我想知道如果我做錯了什麼。否則,我敢肯定,我可以monkeypatch這個問題將符號轉換爲字符串。

感謝

回答

2

,如果你可以只使用字符串鍵。所有documentation examples都使用字符串鍵。儘管我沒有明確提到它,但其他鍵不受支持。

關鍵參數直接傳遞給緩存實現,因此不同的緩存風格可能不同意他們是否接受字符串以外的任何其他字符。

由於緩存除了內存中緩存之外都是外部的,我不確定支持的符號除了防止類似於你的情況之外將會有用。關鍵字實際上會被寫入某處的某個輸出中(它不僅僅是Ruby應用程序的內部),所以從概念上講,關鍵字應該是一個字符串。

編輯迴應評論:是的,在這種情況下,創建一個猴子補丁程序來繞過不得不改變所有呼叫當然是可能的和完全合理的。你是在暗示這是(複製到答案可讀性):

class MemCache 
    def get_server_for_key_with_symbols(key, options = {}) 
    key = key.to_s if key.is_a? Symbol 
    get_server_for_key_without_symbols(key, options) 
    end 
    alias_method_chain :get_server_for_key, :symbols 
end 

我也只考慮做一個項目範圍內的搜索和替換爲\.fetch(:\w+)\.fetch("$1")取代它(重複readwrite如果需要的話)。這可能應該覆蓋所有情況的95%,隨後運行的測試套件應該會捕獲其餘的錯誤。

一般來說:雖然現在Rails的文檔很不錯,但很多假設不幸仍然是隱含的。仔細查看文檔中給出的示例並使用相同的樣式通常是個不錯的主意。記錄的例子始終是如何使用框架的。

+0

使用字符串鍵可能看起來像是明顯的解決方案,但令人沮喪的是,由於符號起初工作,所有我的緩存語句都使用符號。 在這一點上它只是更容易猴補丁,這樣的事情似乎工作: #這是能夠使用符號rails.cache 類MEMCACHE 高清get_server_for_key_with_symbols(鍵,選項= {}) 關鍵= key.to_s if key.is_a?符號 get_server_for_key_without_symbols(鍵,選項) 結束 alias_method_chain:get_server_for_key,:符號 結束 – gmoniey 2010-02-25 08:45:20

+0

感謝清理我的猴子補丁的編輯。似乎你不能在評論中做造型。 說實話,我不想做一個項目範圍廣泛的搜索和替換的唯一原因是我覺得符號提供了更多的可讀性。顯然,這完全是個人偏好,並與我的代碼編輯器密切相關。 謝謝。 – gmoniey 2010-02-25 18:32:33

+0

你也可以在**評論**中做*造型*。大多。 – Sai 2010-03-07 07:47:10

-2

FWIW,它是典型的Rails.cache.read和Rails.cache.write。

+5

我不認爲這是正確的 - .fetch變體旨在執行緩存未命中的塊。我認爲這是一個很常見的成語。 – Joe 2012-01-12 21:41:06