Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在事件开始前一小时触发的最佳方式_Ruby On Rails_Cron_Background Process_Rake Task - Fatal编程技术网

Ruby on rails 在事件开始前一小时触发的最佳方式

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的工作人员。首先,你必须决定谁将负责安排工作。您可以有一个每十五分钟运行一次的后台进程,也可以让模型在其生命周期的某个时间点(可能是在创建之后)安排事件 前一种解决方案更易于理解和维护,但后台进程将有许多无用的空循环 另一方面,后一种解决方案更精确。它将根据需要执行多次。但是,如果

我有许多约会模式,它们在一天中的不同时间开始,或者是在: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