2014-03-27 160 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

嗯,我想这是不是一个真正的好解决你的问题。敬请关注。 –