首页 文章

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

提问于
浏览
210

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

有任何想法吗?谢谢

5 回答

  • 16

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

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

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

  • 2

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

    例如:

    require 'config/environment'
    

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

  • 373

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

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

  • 11

    :环境依赖关系被正确地调用了,但是rake仍然可能不知道你的模型所依赖的其他宝石 - 在我的一个案例中,'protected_attributes' .

    答案是运行:

    bundle exec rake test:new_task
    

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

  • 1

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

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

相关问题