ruby-on-rails - 缓存表中的所有模型

标签 ruby-on-rails activerecord caching models

我需要缓存(并过期)表中的所有模型。

例如,如果我有一个名为 Currency 的模型,我只有不到 10 种可能的货币。因此,最好有:

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

这样

Currency.all
Currency.find_by_name("USD")

不应该击中数据库。

您认为这可能是一个好方法吗?

另外,如果您认为使用没有数据库备份的模型会更好,请对此发表评论。请注意,我想要一个 AR 风格的关联。

最佳答案

由于数据集如此之小,可能最好的办法是将其缓存在本地内存中。有几种方法可以做到这一点,一种是使用 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

可能有一个插件可以为你处理这个问题,但我根本没有研究过。

关于ruby-on-rails - 缓存表中的所有模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223128/

相关文章:

ruby-on-rails - 我无法使用 RSpec 2 和 FactoryGirl 保存对象

mysql - 多态性| self 引用| Rails 事件记录模型

java - 哪种开源Java缓存框架最受欢迎,为什么?

javascript - 为什么 Rails 的 Assets 缓存在暂存环境中不适用于 JS?

ruby-on-rails - 在 Google Cloud Run 中使用 Sidekiq 的 Rails 作业不起作用

ruby-on-rails - Assets :precompile for . js 文件? rails 3.1

ruby-on-rails - 带连接的 Rails named_scopes

ios - UI图像缓存

ruby-on-rails - 当用户输入的 url 不正确时,最理想的错误是什么?

ruby-on-rails - 路由问题 : what if I want both a resource to be nested and on its own?