我正在使用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执行的锁定,我不确定这是否安全。是否可以检查是否有锁?
还有更好的方法吗?
答案 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