Ruby on rails rails rake任务是否提供对ActiveRecord模型的访问?

Ruby on rails rails rake任务是否提供对ActiveRecord模型的访问?,ruby-on-rails,activerecord,rake,task,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任务,但似乎我无法访问我的模型。我认为这是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

有什么想法吗?谢谢

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

例如:


或者,您可以单独要求每个任务,但您可能会遇到环境问题或未设置等)

如果解决了,任务应该如下所示:

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

请注意添加到任务中的
=>:环境
依赖项

当您开始编写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

您的所有rails模型等都将从每个任务块中为当前环境提供,除非您使用的是生产环境,在这种情况下,您需要使用特定的模型。在任务主体内执行此操作。(IIRC这在不同版本的Rails之间有所不同。)

调用:环境依赖关系是非常正确的,但是rake可能仍然不知道您的模型所依赖的其他gem—在我的一个例子中是“受保护的属性”

答案是运行:

bundle exec rake test:new_task

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

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

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

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

使用以下语法添加逻辑:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
使用以下命令运行上述任务:

bundle exec rake test:new_task  


这将工作,但它会打破耙子一般!添加此更改后,在没有可用DB的情况下尝试rake-T。rake-T应该乐于提供一个rake任务列表,而不需要访问DB!执行此操作后,您将发现需要初始化应用程序的任何其他rake任务(即rake资产:precompile)将失败,并显示“rake中止!应用程序已初始化”。此语法是什么意思?它正在将
新任务
分配给当前环境?
:环境的当前值是多少?google没有帮助。@scoarescoare:environment这里是依赖项,因此在运行
新建任务时,请先加载环境(加载模型),然后运行新建任务。@scoarescoare您可以检查,第一个示例将告诉您如何在Sinatra中实现相同的功能?模型名称必须跟在all后面,没有它就不能工作,就像TodoList.all.each不是TodoList.each idk为什么它看起来可以工作?您不能说
环境作为依赖项是必需的,然后说语法,而不是鼓励OP依赖它吗甚至不使用任何魔法的“魔法”实用程序?
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