Rails Rake任务是否提供对ActiveRecord模型的访问?


235

我正在尝试创建一个自定义的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)

有任何想法吗?谢谢

Answers:


410

弄清楚了,任务应该看起来像:

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

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


4
这个语法是什么意思?分配new_task给当前环境?的当前值是多少:environment多少?谷歌没有帮助。
Scott Coates 2012年

12
@scoarescoare:environment是依赖项,因此在运行时new_task,先加载环境(加载模型),然后再运行new_task。
bigpotato

3
@scoarescoare,您可以查看自定义的rake文档,第一个示例将告诉您
lazybios 2015年

如何在Sinatra中实现同一目标?
AMBasra 2015年

模型名称必须全都遵循,没有它就无法工作,例如TodoList.all.each而不是TodoList.each idk为什么它似乎有效?
Kick Buttowski

17

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

例如:

require 'config/environment'

另外,您也可以单独要求它们,但是可能会遇到环境问题(未设置AR等)


5
这会起作用,但通常会破坏耙!添加此更改后,请尝试在没有可用数据库的情况下使用rake -T。rake -T应该愉快地提供rake任务列表,而不需要访问数据库!
irkenInvader

1
完成此操作后,您将发现需要初始化应用程序的所有其他rake任务(例如rake资产:预编译)将失败,并显示“ rake已中止!应用程序已被初始化”。
2014年

11

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

例如:

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中有所不同。)


2
您难道不只是说environment必须将其作为依赖项,然后说出语法而不是鼓励OP依赖甚至不使用任何魔术的“魔术”实用程序吗?
BalinKingOfMoria恢复CM 2013年

3

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

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

2

:environment依赖关系已被正确地调出,但是rake可能仍然不知道您的模型所依赖的其他gem-在我的一种情况下为'protected_attributes'。

答案是运行:

bundle exec rake test:new_task

这样可以确保环境包括您的Gemfile中指定的所有gem。


1

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.