我需要缓存(并过期)表格中的所有模型。
例如,如果我有一个名为Currency的模型,我只有少于10种可能的货币。因此,最好有:
class Currency < ActiveRecord::Base
cache_all(:expire_in => 10.minutes)
end
这样
Currency.all
Currency.find_by_name("USD")
不应该点击数据库。
您认为这可能是一个好方法吗?
此外,如果您认为使用未由数据库备份的模型会更好,请对此进行评论。请注意,我希望有一个AR风格的协会。
答案 0 :(得分:7)
由于数据集太小,最好的办法是将其缓存在本地内存中。有几种方法可以做到这一点,一种是使用Memoization like I show here。但是,这并不是最有效的,因为它会将all
方法和find_by_name
方法存储在单独的缓存中,即使它们是同一个对象。
另一种方法是重新定义手动缓存对象的方法。这样的事情。
class Currency < ActiveRecord::Base
def self.all
@all_cache ||= super.map(&:freeze) # freeze so you don't modify the cached objects
end
def self.find_by_name(name)
all.detect { |c| c.name.to_s.downcase == name.to_s.downcase }
end
def self.flush_all_cache
@all_cache = nil
end
end
可能有一个插件可以为你处理这个,但我根本没有考虑过这个。