加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:23:25 所属栏目:百科 来源:网络整理
导读:我需要缓存(并过期)表中的所有模型. 例如,如果我有一个名为Currency的模型,我只有少于10种可能的货币.因此,最好有: class Currency ActiveRecord::Base cache_all(:expire_in = 10.minutes)end 以便 Currency.allCurrency.find_by_name("USD") 不应该打DB.
我需要缓存(并过期)表中的所有模型.

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

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

以便

Currency.all
Currency.find_by_name("USD")

不应该打DB.

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

此外,如果您认为使用未由数据库备份的模型会更好,请对此进行评论.请注意,我希望有一个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

可能有一个插件可以为你处理这个问题,但我根本没有考虑过这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读