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
うわー...とても素敵なライブラリ:
あなたは、その後のようなあなたのイベントを設定することができます。ありがとう – Tallboy