0
我有几个模型包含静态数据,我试图缓存它们。我已经阅读了关于缓存的各种指南和railscasts,并认为它很简单,但仍然无法弄清楚。例如,我有以下型号如何在rails中创建静态模型的简单缓存?
class ActionType < ActiveRecord::Base
def self.find(id)
Rails.cache.fetch(cache_key) { ActionType.find(id) }
end
end
但是,这是建立以下错误:
wrong number of arguments (2 for 1)
与以下堆栈跟踪
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'
我最近升级到Rails 2.3。 3(从2.0.1开始)利用更新版本中内置的缓存内容。
此外,大多数这些模型都是带有id和说明的简单参考表。然而,我们有30列和100多行,但仍然是真正静态的数据,如果可能,我想缓存。所有这30列除布尔值和小整数外(最后一列是一个短字符串),所以它不应占用太多内存。
我读到,cache_key是一种方法添加到轨道2.1到ActiveRecord :: Base进行缓存。我尝试覆盖find方法,以便为与ActionType有关系的其他模型自动调用缓存而不是SQL加载。 – user26270 2009-12-04 15:21:37
是的,但cache_key是一个实例方法,而不是一个类方法。所以每个ActiveRecord对象都有一个cache_key,但它对于类的存在没有意义。 – Ben 2009-12-04 15:55:51
我用你的代码和它的工作,除了它仍然对ActionType的列进行查询。所以我将它改为ActionType.find(id,:select =>“id,desc”),并且抛出另一个错误,说SQL不正确;非常奇怪 – user26270 2009-12-04 16:07:37