rails耙任务是否提供对ActiveRecord模型的访问?

我试图创建一个自定义耙任务,但似乎我没有访问我的模型。我以为这是rails任务中隐含包含的内容。

我在lib/tasks/test.rake中有以下代码:

namespace :test do
task :new_task do
puts Parent.all.inspect
end
end

下面是我的父模型:

class Parent < ActiveRecord::Base
has_many :children
end

这是一个非常简单的例子,但是我得到了以下错误:

/> rake test:new_task
(in /Users/arash/Documents/dev/soft_deletes)
rake aborted!
uninitialized constant Parent


(See full trace by running task with --trace)

什么好主意吗?谢谢

59231 次浏览

您可能需要您的配置(应该指定所有所需的模型等)

例如:

require 'config/environment'

或者你可以单独要求每个,但你可能会有环境问题AR没有设置等)

我发现,任务应该是这样的:

namespace :test do
task :new_task => :environment do
puts Parent.all.inspect
end
end

注意添加到任务中的=> :environment依赖项

当你开始编写你的任务时,使用生成器为你剔除它们。

例如:

rails g task my_tasks task_one task_two task_three

你将在lib/tasks中创建一个名为my_tasks.rake的存根(显然使用你自己的命名空间)。它看起来像这样:

namespace :my_tasks do


desc "TODO"
task :task_one => :environment do
end


desc "TODO"
task :task_two => :environment do
end


desc "TODO"
task :task_three => :environment do
end


end

所有的rails模型等都可以从每个任务块中用于当前环境,除非你正在使用生产环境,在这种情况下,你需要使用你想要使用的特定模型。在任务主体内执行此操作。(IIRC这在不同版本的Rails中有所不同。)

:environment依赖关系被正确地指出,但是rake仍然可能不知道你的模型所依赖的其他宝石——在我的例子中,'protected_attributes'。

答案是跑步:

bundle exec rake test:new_task

这保证了环境包含Gemfile中指定的任何宝石。

使用新的ruby哈希语法(ruby 1.9),环境将像这样添加到rake任务中:

namespace :test do
task new_task: :environment do
puts Parent.all.inspect
end
end

使用以下命令生成任务(带有任务名称的命名空间):

rails g task test new_task

使用下面的语法添加逻辑:

namespace :test do
desc 'Test new task'
task new_task: :environment do
puts Parent.all.inspect
end
end

使用以下命令运行上述任务:

bundle exec rake test:new_task

 rake test:new_task