ActiveRecord Migration&耙任务不加载模型?

时间:2010-07-30 02:47:44

标签: ruby-on-rails activerecord migration rake

我知道你可以做这样的事情来加载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?)但这看起来有点笨拙,我希望有一种更清洁的方式。

有什么想法吗?

由于

2 个答案:

答案 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 }