Do rails rake tasks provide access to ActiveRecord models?
我正在尝试创建自定义rake任务,但似乎我无法访问我的模型。 我认为这是rails任务中隐含的内容。
我在lib / tasks / test.rake中有以下代码:
1 2 3 4 5 | namespace :test do task :new_task do puts Parent.all.inspect end end |
这是我的父模型的样子:
1 2 3 | class Parent < ActiveRecord::Base has_many :children end |
这是一个非常简单的例子,但我收到以下错误:
1 2 3 4 5 6 | /> rake test:new_task (in /Users/arash/Documents/dev/soft_deletes) rake aborted! uninitialized constant Parent (See full trace by running task with --trace) |
有任何想法吗? 谢谢
想出来,任务看起来应该是这样的:
1 2 3 4 5 | namespace :test do task :new_task => :environment do puts Parent.all.inspect end end |
请注意添加到任务的
您可能需要您的配置(应指定所有必需的模型等)
例如:
1 | require 'config/environment' |
或者你可以单独要求每个,但你可能有环境问题AR没有设置等)
当您开始编写rake任务时,请使用生成器将它们存根。
例如:
1 | rails g task my_tasks task_one task_two task_three |
你将获得一个名为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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之间有所不同。)
使用新的ruby哈希语法(Ruby 1.9),环境将像这样添加到rake任务:
1 2 3 4 5 | namespace :test do task new_task: :environment do puts Parent.all.inspect end end |
:环境依赖关系被正确地调用了,但是rake仍然可能不知道你的模型所依赖的其他宝石 - 在我的一个案例中,'protected_attributes'。
答案是运行:
1 | bundle exec rake test:new_task |
这可以保证环境包含Gemfile中指定的任何gem。
使用以下命令生成任务(带任务名称的命名空间):
1 | rails g task test new_task |
使用以下语法添加逻辑:
1 2 3 4 5 6 | namespace :test do desc 'Test new task' task new_task: :environment do puts Parent.all.inspect end end |
使用以下命令运行上面的任务:
1 | bundle exec rake test:new_task |
要么
1 | rake test:new_task |