web-dev-qa-db-ja.com

Rails rakeタスクはActiveRecordモデルへのアクセスを提供しますか?

カスタムのレーキタスクを作成しようとしていますが、モデルにアクセスできないようです。これは、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)

何か案は?ありがとう

221
gmoniey

それを理解すると、タスクは次のようになります。

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

=> :environmentタスクに追加された依存関係

385
gmoniey

構成が必要な場合があります(必要なすべてのモデルなどを指定する必要があります)

例えば:

require 'config/environment'

あるいは、それぞれを個別に要求することもできますが、環境の問題が発生する場合がありますAR

16
Luke Schafer

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モデルなどは、production環境を使用している場合を除き、各タスクブロック内から現在の環境で使用できます。使用する特定のモデルが必要です。これはタスクの本体内で行います(IIRCはRailsのバージョンによって異なります)。

11
ocodo

新しいRubyハッシュ構文(Ruby 1.9)を使用すると、環境はrakeタスクに次のように追加されます。

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

:environment依存関係は非常に正確に呼び出されますが、rakeはモデルが依存している他のgem(私の場合は「protected_attributes」)についてまだ知らない場合があります。

答えは次のとおりです。

bundle exec rake test:new_task

これにより、Gemfileで指定されたgemが環境に含まれることが保証されます。

2
Lex Lindsey

以下のコマンドを使用してタスクを生成します(タスク名を持つ名前空間):

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
0
Ni3