バックグラウンドでdelayed_job(4.0.6)でActiveJobを使用しており、スケジュールされたジョブを見つけて削除したいと考えています。
たとえば、私が持っている場合
class MyClass
def my_method
perform_stuff
MyJob.set(wait: 1.month.from_now).perform_later(current_user)
end
end
次に、MyClass インスタンスを編集して my_method を再度呼び出した場合、そのジョブをキャンセルして新しいジョブをスケジュールします。
この投稿http://www.sitepoint.com/delayed-jobs-best-practicesで提案されているように、遅延ジョブ テーブルに 2 つの列を追加しました。
table.integer :delayed_reference_id
table.string :delayed_reference_type
add_index :delayed_jobs, [:delayed_reference_id], :name => 'delayed_jobs_delayed_reference_id'
add_index :delayed_jobs, [:delayed_reference_type], :name => 'delayed_jobs_delayed_reference_type'
このようにして、遅延したジョブを見つけて破棄することができます。しかし、プロジェクト内のジョブのパターンを維持するために、ActiveJob クラス内でそれを行いたかったのです。
私は次のようなことをしたかった:
class MyJob < ActiveJob::Base
after_enqueue do |job|
user = self.arguments.first
job.delayed_reference_id = user.id,
job.delayed_reference_type = "User"
end
def perform(user)
delete_previous_job_if_exists(user_id)
end
def delete_previous_job_if_exists(user_id)
Delayed::Job.find_by(delayed_reference_id: 1, delayed_reference_type: 'User').delete
end
end
しかし、それはうまくいきません。
誰もこの種の問題を抱えていましたか?