我的应用程序中有很多工作,它们具有以下条件:
想想通过短信在月底前5天发出的付款提醒。
我可以想到很多方法可以做到这一点,但老实说,我尝试的每一种方式都会因为不同的时间减法,.where()子句等而超级混乱。
我真的在寻找一种已知的设计模式或一些防弹逻辑,这些逻辑并不会让意大利面乱糟糟的时间减少,更大,更少,并且让人感到困惑at(并且容易出错)
这是我最好的尝试。请随时帮助我从头开始......但它不需要修改它。我觉得这比现在要复杂得多。
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 :(得分:0)
IceCube(处理重复事件)和GUI RecurringSelect的组合可以实现这一点,并且易于使用并允许扩展。
然后,您可以设置您的活动,例如:
IceCube::Rule.monthly
IceCube::Rule.monthly.day_of_month(-10)