0

チケットマスターにあるような購入タイマーの1つを作成したいと考えています。このタイマーでは、注文がロールバックされる前にx分で支払いを行うことができます。

ただし、これを行う方法はよくわかりません。誰かがそれらを提案した後、 delayed_job gemとそれについてのrailscastを見て、機能が異なるように見えました-delayed jobを使用するとアクションを遅らせることができますが、他の何かが起こっていることを条件としてその遅延を作成することはできません。そうする方法がわからない。

私は基本的に私ができる何かを探しています

a)このような(擬似)コードを持っている

if job_timer == 0
   @order.destroy
   #Some redirect/flash stuff
end

b)そのタイマーをページに表示します(つまり、「注文が取り消されるまでに3分25秒の支払いが残っています」)。

何をすべきか/どこを見るべきかについてのアイデアはありますか?

ありがとう、

サーシャ

4

2 に答える 2

3

Delayed_jobはあなたが探しているものです。

たとえば、すべての注文オブジェクトを処理する関数を作成できます。

def purge_orders
  # purge_at is an attribute of order that contains 
  # the datetime when the order should be deleted.
  Order.where("purge_at >= #{DateTime.current}").each {|order| order.destroy }
end

2番目の質問は、JavaScriptの質問です。アイデアは、Railsが残り時間をクライアントに渡し、javascriptがRails側から与えられた残り時間からタイマーを作成するというものです。JavaScriptをビューファイルに配置します。理想的には、アセットフォルダーでjavascriptを分離する必要がありますが、ここではそれを行いません。

<script language="JavaScript">
TargetDate = <%= @order.purge_at - DateTime.current %>;
BackColor = "palegreen";
ForeColor = "navy";
CountActive = true;
CountStepper = -1;
LeadingZero = true;
DisplayFormat = "%%D%% Days, %%H%% Hours, %%M%% Minutes, %%S%% Seconds.";
FinishMessage = "It is finally here!";
</script>
<script language="JavaScript" src="http://scripts.hashemian.com/js/countdown.js"></script>

元のJavaScriptコードのソース

于 2012-10-15T20:46:42.243 に答える
1

delayd_jobはおそらくこれを処理できますが、前の回答が示唆するほど単純ではありません。

私はそれがこのように見えると思います:

order.rb:

after_create :schedule_check_payment

def schedule_check_payment
  self.delay(:run_at => 5.minutes.from_now, :queue => :payment_checks).check_payment
end

def check_payment
  self.reload
  unless payment_exists #check if the user has paid
    self.destroy
  end
end

この手法にもいくつか注意点があります。

  1. 遅延したジョブワーカーが5分後に解放されるとすぐにチェックが実行されますが、キューがバックアップされると、さらに時間がかかる可能性があります。これが、遅延処理のキューを指定する理由です。ワーカーの1つ(または複数)がそのキューからのジョブのみを処理するようにdelayed_jobを設定できると思います。そうすれば、将来、他の遅いタスクにdelayed_jobを使い始めた場合(そして、それは非常に便利な宝石かもしれません)、遅延した処理リソースをすべて消費することで、支払い小切手を滞らせる可能性は低くなります。

  2. 遅延ジョブは、遅延メソッドが呼び出されるオブジェクトをシリアル化します。Order自体に関する何かが、それが支払われたかどうかを判断する場合は、必ずcheck_paymentメソッドでリロードしてください(それがそこにある理由です)。オブジェクトは、ジョブから5分以内にその属性が変更されたことを認識しない可能性があるためです。予定されていました。self.reloadそのため、check_paymentメソッドを呼び出します。

于 2012-10-15T20:57:11.087 に答える