delay_job 3.0.2をインストールしましたが、オブジェクトのメソッド呼び出しで機能します。ただし、たとえば、クラスでスコープを呼び出すと、
Listing.delay.all
その後、エラーが発生しますstack level too deep
。これは、自分が持っているクラスのスコープを呼び出すと発生します。
このエラーは仕様によるものですか?stack level too deep
ここでエラーが発生する理由は何ですか?
ありがとうございました。
delay_job 3.0.2をインストールしましたが、オブジェクトのメソッド呼び出しで機能します。ただし、たとえば、クラスでスコープを呼び出すと、
Listing.delay.all
その後、エラーが発生しますstack level too deep
。これは、自分が持っているクラスのスコープを呼び出すと発生します。
このエラーは仕様によるものですか?stack level too deep
ここでエラーが発生する理由は何ですか?
ありがとうございました。
間接的に質問に答えるには、delayed_jobを正しく使用していないようです。私はあなたのコードが何をするのかを説明し、あなたがおそらく何をしようとしているのかを提案します。
Listing.delay.all
次のメソッドdelay
(この場合all
)はバックグラウンドで実行されます。リストの配列を返す代わりに、Delayed :: Backend :: ActiveRecord::Jobオブジェクトを返します。これはあなたの場合に起こっていることではありませんが、私はそれに行きます。
遅延したジョブの戻り値は保存されないため、バックグラウンドで実行するジョブには副作用があります。通常、副作用は、データベースに何かを保存したり、ファイルを作成したり、後で検出して使用できる何かを作成したりすることです。delayd_jobジョブテーブルを見ると、戻り値が格納されていないことがわかります。
> Delayed::Backend::ActiveRecord::Job.column_names
=> ["id", "priority", "attempts", "handler", "last_error", "run_at", "locked_at", "failed_at", "locked_by", "queue", "created_at", "updated_at"]
とはいえ、Listing.all
および他のすべてのスコープメソッドには副作用はありません。スコープリストを検索して返すだけです。delay_jobを使用する場合は、データベースの更新など、副作用のあるメソッドでのみ使用してください。
残念ながら、何を達成しようとしているのかがわからないと、シナリオでdelayed_jobを使用する方法について、またはそれがジョブに適したツールである場合でも、アドバイスを提供することは困難です。
Listing.delay.all
まず、スタックレベルのエラーが深すぎるのは正常ではないと言います。Rails3アプリのActiveRecordモデルUser
でdelayed_job3.0.2を使用して使用できましたが、正常に機能しました。(それは価値のあることは何もしませんでしたが、あなたが得たエラーをスローする代わりにジョブを返しました。)
> User.delay.all
=> #<Delayed::Backend::ActiveRecord::Job id: 1, priority: 0, attempts: 0, handler: "--- !ruby/object:Delayed::PerformableMethod\nobject:...", last_error: nil, run_at: "2012-05-02 02:10:39", locked_at: nil, failed_at: nil, locked_by: nil, queue: nil, created_at: "2012-05-02 02:10:39", updated_at: "2012-05-02 02:10:39">
繰り返しになりますが、詳細情報なしでそのエラーを理解するためにできることはほとんどありません。delay_jobが実際に実行しているツールに適しているかどうかを判断することから始めて(データをビューに渡すために使用している場合ではありません)、適切に使用してから、まだ実行しているかどうかを確認することをお勧めします。問題があります。
カスタムジョブを作成してから、それをキューに入れる必要があります。
class UserJob < Struct.new
def perform
User.all
end
end
Delayed::Job.enqueue UserJob.new()