2017-02-01 3 views
0

私は、以下の条件を持っている私のアプリでの仕事の多くを持っている:月の特定の期間に冪等付けジョブを作成するにはどうすればいいですか?

  • 一度アクションを実行する必要があり、一度だけ、月
  • ごとに特定の日にアクションを実行する必要があります(例えば、 :月末より10日前)
  • ジョブは1日に数回再実行されるため、冪等でなければならず、何度も再実行して特定のレコードにのみ影響します。レコードを再度有効にすることができます。

SMSを介して月末の5日前に到着する支払いリマインダー。

など、私はこれを行う方法のLOTを考えることができますが、私がしようと正直にすべての方法は、異なる時間減算とスーパー紛らわしいなってしまう、.where()句

私が本当に探しています知らデザインパターンまたはいくつかの時間の減算の混乱スパゲッティ混乱はない防弾ロジック、大きなthans、以下thans、とに(とバグが発生しやすい)見て混乱しているため

これが私の最高の試みでした。しかし、何かを一から手伝ってもらえたら、それを修正する必要はありません。私はこれが必要以上に複雑であるように感じる。

class SMSPaymentReminderJob < Que::Job 

    @priority = 50 

    def run 
    current = Time.now.in_time_zone('America/New_York') 
    window_end = current.end_of_month 
    window_start = window_end.beginning_of_day - 2.days 
    cutoff = current.beginning_of_month.utC# convert to UTC for PG 

    return unless (window_start..window_end).cover? current 

    User.where(sms_enabled: true) 
     .where('"sms_reminder_sent_at" < ? OR "sms_reminder_sent_at" IS NULL', cutoff) 
     .find_in_batches(batch_size: 30) do |users| 

     # ... code here ... 
    end 
    end 

end 

答えて

0

IceCubeの組み合わせ(定期的なイベントを処理するため)と、おそらくRecurringSelect GUIのための使いやすさを念頭に置いてこれを実現し、拡張を可能にします。

IceCube::Rule.monthly 
IceCube::Rule.monthly.day_of_month(-10) 
+0

うわー...とても素敵なライブラリ:

あなたは、その後のようなあなたのイベントを設定することができます。ありがとう – Tallboy

関連する問題