Я решил подойти к проблеме иначе. Вместо того, чтобы планировать работу и уничтожать ее, я просто планирую работу.
Когда пользователь устанавливает напоминание на три дня вперед, создается задание, как и раньше. Если пользователь удалит напоминание по электронной почте, задание все равно будет выполняться через три дня, но ничего не произойдет. Вот пример настройки:
# controllers/users_controller.rb
def schedule_reminder
# Get the user that scheduled the reminder
user = User.find_by_id(params[:id])
# Create a reminder for the user
reminder = user.reminders.create(active: true)
# Schedule the reminder to be sent out
SendReminderJob.set(wait_until: 3.days.from_now).perform_later(reminder.id)
end
def unschedule_reminder
reminder = Reminder.find_by_id(params[:reminder_id])
reminder.destroy
end
Когда пользователь планирует напоминание, выполняется def schedule_reminder
. Этот метод создает напоминание и планирует задание, которое будет выполняться через 3 дня. Он передает идентификатор напоминания в качестве аргумента, чтобы задание могло получить напоминание при запуске.
Когда пользователь удаляет напоминание, выполняется def unschedule_reminder
. Этот метод находит напоминание и удаляет его.
Вот как выглядит моя SendReminderJob
работа:
# jobs/send_reminder_job.rb
class SendReminderJob < ActiveJob::Base
queue_as :default
def perform(*args)
# Get the reminder
# args.first is the reminder ID
reminder = Reminder.find_by_id(args.first)
# Check if the reminder exists
if !reminder.nil?
# Send the email to the user
end
end
end
Когда это задание выполняется через три дня, оно проверяет, установлено ли еще напоминание. Если это так, он отправляет электронное письмо пользователю. В противном случае он ничего не делает. Независимо от того, делает она что-нибудь или нет, эта работа удаляется через три дня!
person
Alexander
schedule
05.02.2016