rails rake任务是否可以访问ActiveRecord模型?

时间:2009-05-18 05:39:15

标签: ruby-on-rails activerecord rake task

我正在尝试创建自定义rake任务,但似乎我无法访问我的模型。我认为这是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)

有什么想法吗?感谢

6 个答案:

答案 0 :(得分:380)

想出来,任务看起来应该是这样的:

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

请注意添加到任务的=> :environment依赖关系

答案 1 :(得分:16)

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

例如:

require 'config/environment'

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

答案 2 :(得分:11)

当您开始编写 rake 任务时,请使用生成器将它们存根。

例如:

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

除非您使用生产环境,否则所有您的导轨型号等都可用于每个任务块中的当前环境,在这种情况下,您需要要求所需的特定型号使用。在任务的主体内执行此操作。 (IIRC在不同版本的Rails之间有所不同。)

答案 3 :(得分:2)

:环境依赖关系被正确地调用了,但是rake仍然可能不知道你的模型所依赖的其他宝石 - 在我的一个案例中,'protected_attributes'。

答案是:

bundle exec rake test:new_task

这可以保证环境包含Gemfile中指定的任何gem。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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