2014-03-27 82 views
0

在Python中,你可以寫一個裝飾的記憶一個功能的響應。Ruby on Rails裝飾器緩存結果?

是否有Ruby on Rails的類似的東西?我有一個模型的方法,使我想要緩存查詢。

我知道我可以做一些事情的方法中,如:

def foo(param) 
    if self.cache[param].nil? 
    self.cache[param] = self.get_query_result(param) 
    else 
    self.cache[param] 
    end 
end 

然而,鑑於我會經常這樣做,我寧願一個裝飾語法。 IMO更清晰更好。

有沒有這樣的事情了Ruby on Rails的?

回答

1

我通常做這個使用自定義訪問器,實例變量和||=操作:

def foo 
    @foo ||= something_or_other 
end 

something_or_other可能是對返回對象foo應該是同一類的私有方法。

編輯

這裏有一個稍微複雜的解決方案,讓您緩存基於用來調用它們的參數的任何方法。

class MyClass 
    attr_reader :cache 
    def initialize 
    @cache = {} 
    end 

    class << self 
    def cacheable(symbol) 
     alias_method :"_#{symbol}_uncached", symbol 

     define_method(symbol) do |*args| 
     cache[[symbol, *args]] ||= (send :"_#{symbol}_uncached", *args) 
     end 
    end 
    end 
end 

這是如何工作:

class MyClass 
    def foo(a, b) 
    a + b 
    end 

    cacheable :foo 
end 

首先,該方法通常被定義。那麼類方法cacheable被調用,它的別名原始的方法,以一個新的名字,然後重新定義它在原來的名稱只有當它尚未高速緩存執行。它首先使用相同的方法和參數檢查緩存中的任何內容,如果存在則返回該值,否則執行原始方法。

+0

嗯,我想這是不是一個真正的好解決你的問題。敬請關注。 –