Rails 3 rake任务在生产中找不到模型

存储在lib/tasks/items_spider.rake我简单的rake任务在开发中运行得很好。 它所做的就是召唤spider!Item模型上。

 namespace :items do desc "Spider the web for data, hoorah" task :spider => :environment do Item.spider! end end 

我有:environment任务作为依赖项,所以一切正常。 但是,当我添加RAILS_ENV=production ,我在本地服务器和生产服务器上都遇到了错误:

 $ rake items:spider RAILS_ENV=production --trace (in /home/matchu/Websites/my-rails-app) ** Invoke items:spider (first_time) ** Invoke environment (first_time) ** Execute environment ** Execute items:spider rake aborted! uninitialized constant Object::Item /home/matchu/.rvm/gems/ruby-1.9.2-preview3@rails3/gems/rake-0.8.7/lib/rake.rb:2503:in `const_missing' /home/matchu/.rvm/gems/ruby-1.9.2-preview3@rails3/gems/rspec-core-2.0.0.beta.22/lib/rspec/core/backward_compatibility.rb:20:in `const_missing' /home/matchu/.rvm/gems/ruby-1.9.2-preview3@rails3/gems/rspec-expectations-2.0.0.beta.22/lib/rspec/expectations/backward_compatibility.rb:6:in `const_missing' /home/matchu/Websites/openneo-impress-items/lib/tasks/items_spider.rake:4:in `block (2 levels) in ' /home/matchu/.rvm/gems/ruby-1.9.2-preview3@rails3/gems/rake-0.8.7/lib/rake.rb:636:in `call' [...trace of how rake gets to my task...] 

这对我来说似乎很奇怪。 显然模型没有正确加载。 我正在使用Rails 3.0.3,虽然这个应用程序的开发在Rails 3处于测试版时开始。 我该如何调试此问题? 谢谢!

与在生产环境中运行应用程序相反,Rake任务不会急于加载整个代码库。 你可以在源代码中看到它:

 module Rails class Application module Finisher # ... initializer :eager_load! do if config.cache_classes && !$rails_rake_task ActiveSupport.run_load_hooks(:before_eager_load, self) eager_load! end end # ... end end end 

因此, 只有$rails_rake_taskfalse ,才会在生产中急切加载应用程序。 $rails_rake_task:environment Rake任务中设置为true

最简单的解决方法是简单地require您需要的模型。 但是,如果您确实需要在Rake任务中加载所有应用程序,则加载它非常简单:

 Rails.application.eager_load! 

所有这些都在开发中的原因是因为Rails在开发模式下自动加载模型。 这也适用于Rake任务。

在您的environment / production.rb中,您应该添加以下内容:

 config.dependency_loading = true if $rails_rake_task 

它解决了我的问题。

(注意:这应该在config.threadsafe!call之后添加)