类缓存如何在rails 2.2+中运行

时间:2009-03-30 10:43:08

标签: ruby-on-rails activerecord

我有一个rails应用程序,它使用手动编码验证器修补ActiveRecord。

通过在config / environment.rb

中添加以下行来创建补丁
Rails::Initializer.run do |config|  
...    
end  

class ActiveRecord::Base  
  include MtLib::DBValidations  
end  

这在生产模式下工作正常,即

config.cache_classes = true  

但是在cache_classes设置为false的情况下,它不能用于开发。

抛出的错误是

    ArgumentError (A copy of MtLib::DBValidations has been removed from  
      the module tree but is still active!):

我的问题是当cache_class设置为false时遵循的过程是什么。 Rails是否重新运行任何初始化方法?如果没有,那么我最好的地方放在我的补丁上以确保它在所有模型中并且在类重新加载后能够幸存下来?

我尝试将补丁添加到config / initializers / active_record_patch,但重新加载类时不会重新运行。

1 个答案:

答案 0 :(得分:2)

由Frederick Cheung在Ruby On Rails谷歌小组提供的解决方案将包含已加载类的目录添加到load_once_path数组中。

我编辑环境.rb看起来像这样

 config.load_paths +=  
   %W( #{RAILS_ROOT}/lib/soap_clients/carefone #{RAILS_ROOT}/lib/mt_lib)  

  # Make sure load_once_paths is a subset of load_paths  
  config.load_once_paths +=  %W( #{RAILS_ROOT}/lib/mt_lib)  

现在这可以在开发模式下工作,而无需在每个请求上重新加载服务器