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


235

カスタムの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)

何か案は?ありがとう

回答:


410

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

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

=> :environmentタスクに追加された依存関係に注意してください


4
この構文はどういう意味ですか?new_task現在の環境に割り当てていますか?現在の値は:environment何ですか?グーグルは助けていない。
Scott Coates

12
@scoarescoare:environmentは依存関係であるため、を実行するときは、new_task最初に環境をロード(モデルをロード)してから、new_taskを実行します。
bigpotato 2013年

3
@scoarescoare カスタムレーキドキュメントをチェックできます。最初の例で
わかり

シナトラで同じことを達成する方法は?
AMBasra 2015

モデル名はallに続く必要があり、TodoList.allではなくTodoList.all.eachのようにそれなしでは機能しません。
Kick Buttowski、2018

17

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

例えば:

require 'config/environment'

または、それぞれを個別に要求することもできますが、環境設定のARが設定されていない可能性があります)


5
これはうまくいきますが、一般的にはレーキを壊します!この変更を追加した後、使用可能なDBなしでrake -Tを試してください。rake -TはDBへのアクセスを必要とせずにrakeタスクのリストを喜んで提供するはずです!
irkenInvader 2010

1
これを実行すると、アプリケーションの初期化を必要とする他のレーキタスク(つまり、レーキアセット:プリコンパイル)が「レーキが中止されました!アプリケーションはすでに初期化されています」で失敗することがわかります。
2014

11

レーキタスクの作成を開始したら、ジェネレーターを使用してタスクをスタブします。

例えば:

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


2
それenvironmentが依存関係として必要であると言って、それからOPにマジックを使用しない「マジック」ユーティリティに依存するように促すのではなく、構文を言っていただけませんか?
BalinKingOfMoria 2016

3

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

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

2

:environment依存関係は正しく呼び出されますが、rakeはモデルが依存する他のgemをまだ認識していない可能性があります。私の場合、 'protected_attributes'です。

答えは実行することです:

bundle exec rake test:new_task

これにより、Gemfileで指定されたgemが環境に確実に含まれるようになります。


1

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.