2017-02-28 8 views
0

私はモデルで動作するレーキタスクを持っています。しかし、私はモデルの中で、彼らは、アプリケーションの代わりにレーキから使用されていることを伝える必要があります。私のベストプラクティスは、rakeタスクを実行する前にコマンドラインで環境変数を設定することですが、それはチームの全員が環境変数を使用することを覚えておく必要があります。具体的には、rakeタスクの実行中にDelayed::Jobhandle_asynchronouslyの読み込みをスキップするif文があります。私たちは私たちの移行タスクを実行するとRailsモデルがロードされる前にrakeタスクで何かを実行する

class Thing < ActiveRecord::Base 
    searchable do 
    string :title 
    text :title, :content 
    end 
    handle_asynchronously unless ENV['MIGRATINGDATA'] 
end 

我々はこれを行う:

MIGRATINGDATA=true bundle exec rake project:migrate_data

私は、コマンドラインに特殊な添加する必要を取り除くしたいと思います。私たちの移行コードは、偽のSunspotインスタンスを読み込んで、データの移行中にインデックスを無効にします。

答えて

1

ENV['HELLO_RAKE'] = true 

require_relative 'config/application' 

Rails.application.load_tasks 

代わりにあなたがENVを可能性が使用してのをあなたが望んでいた場合には、例えば、定数を設定HELLO_RAKE = trueを入力し、defined?(HELLO_RAKE)をチェックします。

代替は、実行中のプログラムがrakeある場合だけチェックすることです:

handle_asynchronously unless File.basename($0) == "rake" 

これらのアプローチの両方の欠点は、彼らが他が含まれており、実際にあなたが熊手を使用している任意の時間になるということです移行に関係しないレイクタスク。

+0

これはうまくいくようです!私はそれを試して、期待どおりに働いているようだ。私はENVを使用し、それはモデルの前にロードされ、設定されています。ありがとう! – Sixty4Bit

0

rakeタスクからモデルを使用しているかどうかを気にするモデルでは、何か問題があります。代わりに、特定のメソッドにパラメータを追加することができます。特定のユースケースでは、代わりにすぐにジョブを実行できます。あなたのrakeタスクの開始時にこれを置く:ちょうどあなたのRakefileの上部に何か設定

Delayed::Worker.delay_jobs = false 
+0

モデルについての良い点は、レーキにあるかどうかに気を付けるべきではありません。通常、私は同意しますが、このケースでは、移行後にデータを移行するため、この1つの特定の行を実行する必要はありません。これは一度だけ行われます。展開が成功すると、このコードは削除されます。しかし、私たちが実際に展開するまでは、開発中にこれを必要としています。 'delayed_jobs = false'は役に立ちません。私は選択肢があります。 – Sixty4Bit

関連する問題