我需要缓存(和到期)中的所有模型在表中。

例如,如果我有一个名为货币的模式,我只有小于10种可能的货币。因此,这将是很好有:

class Currency < ActiveRecord::Base
  cache_all(:expire_in => 10.minutes)
end

,使得

Currency.all
Currency.find_by_name("USD")

不应该打的DB。

你觉得这可能是一个好办法?

另外,如果你相信它会更好地使用不是由DB备份的模式,请对此进行评论。请注意,我想有一个AR-风格关联。

有帮助吗?

解决方案

由于数据集是如此之小,可能是最好的事情是它缓存在本地内存。有几个方法可以做到这一点,一个是使用记忆化像我在这里展示。然而这不是最有效的,因为它会存储在单独的高速缓存的方法allfind_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

有可能会来处理这给你一个插件,但我还没有在所有看着这一点。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top