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


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

有任何想法吗?谢谢


206
2018-05-18 05:39


起源




答案:


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

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

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


367
2018-05-18 05:47



这个语法是什么意思?它正在分配 new_task 到目前的环境?什么是当前的价值 :environment?谷歌没有帮助。 - Scott Coates
@scoarescoare:这里的环境是依赖关系,所以在运行时 new_task,首先加载环境(加载模型),然后运行new_task。 - Edmund
@scoarescoare你可以检查 自定义rake doc,第一个例子会告诉你 - lazybios
如何在Sinatra实现同样的目标? - AMBasra
模型名称必须跟随所有并且它不起作用没有它像TodoList.all.each不TodoList.each idk为什么它似乎工作? - Kick Buttowski


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

例如:

require 'config/environment'

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


16
2018-05-18 05:45



这样可行,但一般会破坏佣金!添加此更改后,请尝试使用rake -T而不使用DB。 rake -T应该很乐意提供一个rake任务列表,而无需访问数据库! - irkenInvader
执行此操作后,您将发现需要初始化应用程序的任何其他rake任务(即rake资产:预编译)将失败,并且“rake aborted!应用程序已经初始化”。 - brent


当你开始写你的  任务,使用生成器为你存根。

例如:

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


11
2017-08-29 06:56



你能不能这么说 environment 需要作为一个依赖,然后说出语法,而不是鼓励OP依赖甚至不使用任何魔法的“魔法”工具? - BalinKingOfMoria


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

答案是运行:

bundle exec rake test:new_task

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


2
2017-07-05 00:13





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

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

0
2018-06-14 21:30