Ruby on rails 如何在rails中创建静态模型的简单缓存?

Ruby on rails 如何在rails中创建静态模型的简单缓存?,ruby-on-rails,Ruby On Rails,我有一些包含静态数据的模型,我正在尝试缓存它们。我读过关于缓存的各种指南和railscasts,认为这很简单,但仍然无法理解。例如,我有以下模型 class ActionType < ActiveRecord::Base def self.find(id) Rails.cache.fetch(cache_key) { ActionType.find(id) } end end 使用以下堆栈跟踪 C:/ruby/lib/ruby/gems/1.8/gems/activ

我有一些包含静态数据的模型,我正在尝试缓存它们。我读过关于缓存的各种指南和railscasts,认为这很简单,但仍然无法理解。例如,我有以下模型

class ActionType < ActiveRecord::Base

  def self.find(id)
    Rails.cache.fetch(cache_key) { ActionType.find(id) }
  end 

end
使用以下堆栈跟踪

C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `send'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/belongs_to_association.rb:49:in `find_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:240:in `load_target'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations/association_proxy.rb:112:in `reload'
C:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.3.3/lib/active_record/associations.rb:1219:in `action_type'
我最近升级到了Rails2.3.3(从2.0.1升级到2.3.3),以利用最近版本中内置的缓存功能


此外,仅供参考,大多数模型都是带有id和说明的简单参考表。然而,其中一个有30列和100多行,但仍然是真正的静态数据,如果可能的话,我希望缓存这些数据。除了一列之外,这30列都是布尔值和小整数(最后一列是短字符串),因此它不应该占用太多内存。

这里的一个问题是试图覆盖
ActiveRecord
查找
方法。我可能会创建一个名为
find\u cached
的类方法或其他方法

这样一来,您的
cache\u键
变量从何而来?考虑一下使用ID,比如

class ActionType < ActiveRecord::Base

  def self.find_cached(id)
    Rails.cache.fetch("action_type_cache/#{id}") { ActionType.find(id) }
  end 

end
class ActionType
我了解到cache\u key是rails 2.1中添加到ActiveRecord::Base中用于缓存的方法。我尝试重写find方法,以便对与ActionType有关系的其他模型自动调用缓存,而不是SQL加载。是的,但cache_key是实例方法,而不是类方法。因此,每个ActiveRecord对象都有一个cache_键,但它对于类来说没有意义。我使用了您的代码,它工作正常,只是它仍然对ActionType上的列进行了查询。所以我把它改为ActionType.find(id,:select=>“id,desc”),它抛出另一个错误,说SQL不正确;非常奇怪的是,在开发环境中,Rails不缓存列的信息。如果在生产模式下尝试,它将执行一次列信息查询,然后缓存结果。
class ActionType < ActiveRecord::Base

  def self.find_cached(id)
    Rails.cache.fetch("action_type_cache/#{id}") { ActionType.find(id) }
  end 

end