2009-12-04 84 views
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列除布尔值和小整数外(最后一列是一个短字符串),所以它不应占用太多内存。

回答

2

这里的一个问题是试图覆盖ActiveRecordfind方法。我可能会创建一个名为find_cached的类方法。

那样,你的cache_key变量从哪里来?考虑只使用ID,像

class ActionType < ActiveRecord::Base 

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

end 
+0

我读到,cache_key是一种方法添加到轨道2.1到ActiveRecord :: Base进行缓存。我尝试覆盖find方法,以便为与ActionType有关系的其他模型自动调用缓存而不是SQL加载。 – user26270 2009-12-04 15:21:37

+0

是的,但cache_key是一个实例方法,而不是一个类方法。所以每个ActiveRecord对象都有一个cache_key,但它对于类的存在没有意义。 – Ben 2009-12-04 15:55:51

+0

我用你的代码和它的工作,除了它仍然对ActionType的列进行查询。所以我将它改为ActionType.find(id,:select =>“id,desc”),并且抛出另一个错误,说SQL不正确;非常奇怪 – user26270 2009-12-04 16:07:37