Rails delayed_job:更新现有作业而不是创建新作业?

时间:2015-11-11 17:41:03

标签: ruby-on-rails delayed-job

我正在使用delayed_jobs gem在他/她预订前一小时向用户发送提醒通知。

除非用户决定更改预订的开始时间,否则此工作正常。当用户更改星形时间时,delayed_job会创建一个新条目。这是不期望的行为,因为用户还获得已经改变的初始开始时间的提醒。

所以我想要的是用新的开始时间更新现有条目或删除第一个条目并创建一个新条目。

我正在考虑在delayed_jobs tabel中为预订ID添加一个新列,并执行以下操作:

 job = Delayed_jobs.where(:reservation_id => user.reservation.id)

If job.present? 
 job.reservation_id=user.reservation.id
 job.save
else
 # create new job
end

由于delayed_jobs执行的锁定,我不确定这是否安全。是否可以检查是否有锁?

还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

您只能选择从现在开始不到一小时的预订,然后创建一份工作并发送提醒。

在预订中添加:reminder_sent_at,以便您可以跳过已提醒的预订。

从模型加载队列,以便从rake任务和调度程序

轻松调用
class Reservation < ActiveRecord:Base

  def self.send_reminders
    reservations_to_remind = where(:reservations => {:seat_at => Time.now..1.hour.from_now}).where(:reminder_sent_at => nil) 
    potential_customers.each do |c|
      ReservationMailer.delay.reminder(c.id).send
    end
  end

  def reminder_sent?
    reminder_sent_at.present?
  end 

  def reminder_sent!
    update_attribute(:reminder_sent_at, Time.now)
  end 

end

佣金任务

namespace :reservations do

  desc "Send Reminders"
  task :send_reminders => [:environment] do |t|
    Reservation.send_reminders
  end

end

然后,在邮件程序中,检查以确保尚未发送提醒(由于竞争条件,任务的意外重新运行,其他错误,它可能在队列中两次)。

class ReservationMailer

  def reminder (reservation_id)
    @reservation = Reservation.find(reservation_id)
    unless @reservation.reminder_sent?
      mail
      @reservation.reminder_sent!
    end
  end

end
相关问题