2017-05-13 7 views
0

私はイベントのチケットを予約するためのRailsアプリケーションを作成しています。15分後にRailsでタスクを実行

ユーザーが購入したいチケットを選択すると、彼は15分以内にチェックアウトを完了します。さもなければ、チケットは解放され、他の誰かによって予約することができます。

チケットを15分間「ブロック」して15分後に再び利用できるようにするにはどうすればよいですか?

+0

15分後にdelayed_jobを使用してタスクを実行できますか? – django

+0

http://stackoverflow.com/questions/5494369/how-to-schedule-a-function-to-execute-at-a-future-time – Iceman

答えて

1

あなたのチケットモデル(または使用しているモデル)にステータスフィールドを持ち、ユーザーがそれを選択すると、それは「部分予約済み」と表示されます。

あなたがsidekiqを使用している場合は、「your_method_here」または「YourWorker」の予約が完了したかどうかをチェックするためのロジックが含まれています

YourWorker.perform_in(15.minutes, ticket_id) 

handle_asynchronously :your_method_here, :run_at => Proc.new { 15.minutes.from_now } 

遅れジョブを使用している場合、または完了していない場合は未割り当てとしてマークします。

+0

ページの残りの時間を取得して表示するにはどうすればよいですか? –

+0

sidekiqでは、job_idをどこかに保存しなければなりません。次に、job = Sidekiq :: ScheduledSet.new.find_job(job_id)を使用してジョブを取得し、job.atはジョブの実行予定時刻を返します。 – rohan

+0

btw、バックグラウンドジョブには何を使用していますか? – rohan

1

ActiveJobは、バックグラウンドで仕事をするのに役立ちます。 ActiveJobを使用すると、遅延操作のジョブを生成し、後で実行できるようにエンキューできます。ブール値フィールドをreservedのようにモデルに追加し、ユーザーが最初に予約してバックグラウンドジョブを実行したときにtrueにして、15分後にユーザーが購入を完了しない場合はfalseに戻します。

TicketJob.set(wait_until: 15.minutes.from_now).perform_later(@ticket) 

アクティブジョブは、ジョブを宣言し、さまざまなキューバックエンドで実行するためのフレームワークです。 ActiveJobのバックエンドを設定するには、DelayedJobをご覧ください。それは簡単で十分です。

+0

ActiveJob(Railsのビルトイン)とDelayedJob/Sidekiq/Resqueの違いは何ですか? –

+0

'ActiveJob'は、DelayedJob、Resque、またはsidekiqのようなバックエンドを処理する標準的なラッパーで、同じ方法でそれらすべてに対話することができます。たとえば、ジョブクラスを変更せずにバックエンドをいつでもResqueからSidekiqに変更できます。 –

+0

購入を完了するための残り時間を表示したい場合は、[このような]予約モデル(https://image.ibb.co/dQvPgQ/Screen_Shot_1396_02_24_at_12_26_27.png)を作成し、現在の時間と予約created_at時間。 –

関連する問題