【问题标题】:Do rails rake tasks provide access to ActiveRecord models?rails rake 任务是否提供对 ActiveRecord 模型的访问?
【发布时间】:2010-10-26 23:00:27
【问题描述】:

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

有什么想法吗?谢谢

【问题讨论】:

    标签: ruby-on-rails activerecord rake task


    【解决方案1】:

    想通了,任务应该是这样的:

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

    注意添加到任务中的=&gt; :environment 依赖项

    【讨论】:

    • 这个语法是什么意思?将new_task 分配给当前环境? :environment 的当前值是多少?谷歌没有帮助。
    • @scoarescoare :environment 这里是依赖,所以在运行new_task时,先加载环境(加载你的模型),然后运行new_task。
    • @scoarescoare 你可以查看custom rake doc,第一个例子会告诉你
    • 如何在 Sinatra 中实现同样的功能?
    • 模型名称必须跟在所有后面,没有它就不行
    【解决方案2】:

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

    例如:

    require 'config/environment'
    

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

    【讨论】:

    • 这会起作用,但一般会破坏 rake!添加此更改后,在没有可用数据库的情况下尝试 rake -T。 rake -T 应该很乐意提供一个 rake 任务列表,而无需访问数据库!
    • 执行此操作后,您会发现任何其他需要初始化应用程序的 rake 任务(即 rake assets:precompile)都会失败,并显示“rake aborted!应用程序已初始化”。
    【解决方案3】:

    当您开始编写 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 之间有所不同。)

    【讨论】:

    • 你不能直接说environment 是一个依赖项,然后说语法,而不是鼓励 OP 依赖甚至不使用任何魔法的“魔法”实用程序吗?
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      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
      

      【讨论】:

        【解决方案6】:

        :environment 依赖项被正确调用,但 rake 可能仍然不知道您的模型所依赖的其他 gem - 在我的一个例子中,'protected_attributes'。

        答案是跑:

        bundle exec rake test:new_task
        

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

        【讨论】:

          猜你喜欢
          • 2011-07-13
          • 1970-01-01
          • 2012-02-16
          • 2011-03-23
          • 2010-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-10
          相关资源
          最近更新 更多