2016-10-20 8 views
0

これは私が達成しようとしているものです: ユーザーとして、私はクラスのためのスポットを予約することができます。クラスがすでに満員の場合、私は待機リストに載っています。新しいスポットが利用可能になると、私は電子メールを受け取ります。その後、アプリは24時間待機するバックグラウンドジョブを開始します。私が24時間前に出席していることを確認していない場合、それは待機リストの次の人に帰され、24時間前にも確認する必要があります。別のジョブからジョブを開始

問題は、リストの次の人にスポットを渡すときです。私は既に「タイマージョブ」に入っているので、次の人と再度呼び出す必要があります。

class TimerJob 
    def perform(user_id) 
    send_confimation_email 
    if #didn't confirm before 24h 
     TimerJob.perform(next_user_on_list_id) 
    else 
     # save his spot 
    end 
    end 
end 

最初のジョブが正常に動作し、それは、電子メールを送信し、24時間以内に確認を待ち、その後、リスト上の次の人に別の電子メールを送信しますが、別の仕事(5行目)を起動しません。したがって、24時間待ってからプロセスを再開することはできません。

だから、私の例のように、仕事の中で仕事を呼び出すにはどうすればいいですか? これが機能しない理由はありますか?

これを複雑にしすぎて、新鮮な目で簡単に解決できますか?

私はジョブ内からmoduleを呼び出すと考えました。これは、基本的にジョブを呼び戻すことになります。しかし、ここで同じ、動作しませんでした。 入力があれば幸いです。

+0

サイドキックを使用していますか? – Jayaprakash

+0

@Jayaprakashはい私は –

+0

これを試すことができますか? "TimerJob.new.perform(next_user_on_list_id)"または "TimerJob。perform_async(next_user_on_list_id)" – Jayaprakash

答えて

0

あなたが投稿したコードは、ジョブをエンキューするという点では機能するはずですが、あなたが投稿したコードからは、ワークフローの「24時間待ち」の部分が起きていることは明らかではありません。 TimerJobから電子メールが送信された後、すぐにが確認を確認したようです。

申し込み時にすぐにメールを送信し、メールが確認されたかどうかを確認するTimerJob.perform_in(24.hours, next_user_id)でジョブをエンキューすると、より意味があります。その後、24時間以内に別のメールを送信して別のジョブをキューに入れることができます。

関連する問題