Ruby on rails 在事件开始前一小时触发的最佳方式
我有许多约会模式,它们在一天中的不同时间开始,或者是在:00,:15,:30,:45。我想在事件开始前1小时触发代码发送提醒。使用后台工作程序触发此操作的最佳方式是什么?我也在使用gem,这样我就可以安排Sidekiq的工作人员。首先,你必须决定谁将负责安排工作。您可以有一个每十五分钟运行一次的后台进程,也可以让模型在其生命周期的某个时间点(可能是在创建之后)安排事件 前一种解决方案更易于理解和维护,但后台进程将有许多无用的空循环Ruby on rails 在事件开始前一小时触发的最佳方式,ruby-on-rails,cron,background-process,rake-task,Ruby On Rails,Cron,Background Process,Rake Task,我有许多约会模式,它们在一天中的不同时间开始,或者是在:00,:15,:30,:45。我想在事件开始前1小时触发代码发送提醒。使用后台工作程序触发此操作的最佳方式是什么?我也在使用gem,这样我就可以安排Sidekiq的工作人员。首先,你必须决定谁将负责安排工作。您可以有一个每十五分钟运行一次的后台进程,也可以让模型在其生命周期的某个时间点(可能是在创建之后)安排事件 前一种解决方案更易于理解和维护,但后台进程将有许多无用的空循环 另一方面,后一种解决方案更精确。它将根据需要执行多次。但是,如果
另一方面,后一种解决方案更精确。它将根据需要执行多次。但是,如果模型发生更改,则可能会有困难:例如,时间在创建后已被修改。您需要以某种方式取消上一个事件,并安排一个新事件。时钟系统gem用于固定计划作业(cron的替代品)。您需要使用
ActionMailer.delay_,直到sidekiq
附带的:
class Appointment
after_create :queue_reminder
def queue_reminder
MyMailer.delay_until(event_time - 1.hour).appointment_reminder(id)
end
end
请参见此处的sidekiq
文档:
正如shock_one提到的,如果你用一个新的日期更新约会,你必须重新发出提醒并取消旧的约会。如果约会被销毁,您还需要取消作业
为此,我建议您使用,以及提醒\u作业\u id
列。然后,您的约会
模型将类似于:
class Appointment
before_save :queue_reminder, if: :event_time_changed?
after_destroy :cancel_reminder, if: :reminder_job_id?
def queue_reminder
cancel_reminder if reminder_job_id
self.reminder_job_id = MyMailer.delay_until(event_time - 1.hour)
.appointment_reminder(id)
end
def cancel_reminder
Sidekiq::Status.cancel reminder_job_id
end
end