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

gmo*_*iey 224 rake activerecord ruby-on-rails task

我正在尝试创建自定义rake任务,但似乎我无法访问我的模型.我认为这是rails任务中隐含的内容.

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

namespace :test do
  task :new_task do
    puts Parent.all.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)

这是我的父模型的样子:

class Parent < ActiveRecord::Base
  has_many :children
end
Run Code Online (Sandbox Code Playgroud)

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

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

(See full trace by running task with --trace)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?谢谢

gmo*_*iey 394

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

namespace :test do
  task :new_task => :environment do
    puts Parent.all.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)

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

  • @scoarescoare:这里的环境是依赖项,因此在运行`new_task`时,首先加载环境(加载模型),然后运行new_task. (11认同)
  • 这个语法是什么意思?它将`new_task`分配给当前环境?`:environment`的当前值是多少?谷歌没有帮助. (4认同)
  • @scoarescoare你可以检查[自定义rake doc](http://guides.rubyonrails.org/command_line.html#custom-rake-tasks),第一个例子会告诉你 (3认同)

Luk*_*fer 16

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

例如:

require 'config/environment'
Run Code Online (Sandbox Code Playgroud)

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

  • 这样可行,但一般会破坏佣金!添加此更改后,请尝试使用rake -T而不使用DB.rake -T应该很乐意提供一个rake任务列表,而无需访问数据库! (5认同)

oco*_*odo 11

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

例如:

rails g task my_tasks task_one task_two task_three 
Run Code Online (Sandbox Code Playgroud)

你会得到一个在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
Run Code Online (Sandbox Code Playgroud)

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

  • 您难道不只是说必须将“环境”作为依赖项,然后说语法而不是鼓励OP依靠甚至不使用任何魔术的“魔术”实用程序吗? (2认同)

小智 6

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

rails g task test new_task
Run Code Online (Sandbox Code Playgroud)

使用以下语法添加逻辑:

namespace :test do
  desc 'Test new task'
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)

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

bundle exec rake test:new_task  
Run Code Online (Sandbox Code Playgroud)

或者

 rake test:new_task
Run Code Online (Sandbox Code Playgroud)


apa*_*ana 5

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

namespace :test do
  task new_task: :environment do
    puts Parent.all.inspect
  end
end
Run Code Online (Sandbox Code Playgroud)