我知道你可以做这样的事情来加载rails环境:
task :my_task => :environment do
MyModel.find(1)
end
但似乎模型中的代码没有执行。我正在使用acts_as_audited,并且有一个很好的类函数可以检索所有正在审计的模型。电话看起来像是:
Audit.audited_classes
要将模型指定为可审核,只需将此行添加到模型中:
acts_as_audited
当在控制台中执行audited_classes时,我得到一个包含所有审计类的数组;然而,当我从rake任务(或迁移)中执行它时,我得到一个空数组。
[编辑]
在玩了一下之后,我注意到如果模型在被引用之前没有被实际加载(即延迟加载)。我认为在配置中将cache_classes设置为true会解决这个问题,但它们似乎仍然是延迟加载的。
一个可能的解决方案是循环遍历所有模型(如本文中所解释的那样:Is there a way to get a collection of all the Models in your Rails app?)但这看起来有点笨拙,我希望有一种更清洁的方式。
有什么想法吗?
由于
答案 0 :(得分:2)
当你有config.threadsafe时会发生这种情况!在生产环境中,它自动设置config.dependency_loading = false。这可以防止rails在rake任务期间加载模型类。
解决这个问题的方法是在环境文件中设置“config.dependency_loading = true if $ rails_rake_task”。例如,在我的production.rb中,我有:
config.threadsafe!
config.dependency_loading = true if $rails_rake_task
或者您也可以
config.threadsafe! unless $rails_rake_task
答案 1 :(得分:1)
您可以添加config / environments / development.rb:
Dir[Rails.root.join('app', 'models', '**/*')].each { |file| File.basename(file, '.rb').camelize.constantize }