Чтобы разбить решения на две основные группы, вы можете:
- Используйте решение для организации очередей Ruby/Rails, например DelayedJob, Resque или Sidekiq; или,
- Используйте кронджоб.
Первое, как правило, имеет наибольший смысл, если вы уже используете один из этих инструментов или знаете, что в конечном итоге вы собираетесь использовать один из них. Все они требуют довольно значительных усилий для запуска. Resque и Sidekiq требуют настройки сервера Redis, в то время как DelayedJob использует вашу существующую базу данных. Для Resque дополнительно требуется плагин для планирования заданий, в то время как DelayedJob и Sidekiq изначально поддерживают планирование заданий. Все три требуют создания моделей заданий и настройки рабочих процессов для запуска.
Последнее довольно просто, если у вас есть доступ к cron. Напишите себе скрипт на Ruby и запланируйте его автоматический запуск через cron.
Я какое-то время не использовал state_machine, но это должно работать (если нет, то идея понятна):
#!/usr/bin/env /path/to/project/bin/rails runner
Order.where(state: 'confirmed').where("created_at <= #{5.days.ago}").find_each do |o|
o.not_received_by_5_days
end
Что тут происходит? Как только наш объект Order создан, он переходит в состояние confirmed
. Таким образом, чтобы найти заказы, которым нужно немного подтолкнуть, мы можем запустить запрос ActiveRecord, чтобы найти заказы в состоянии confirmed
, которым 5+ дней. Затем мы перебираем каждую запись и запускаем событие not_received_by_5_days.
Всем этим управляет исполняющая программа Rails, которая загружает вашу среду Rails и выполняет там код вашего скрипта (точно так же, как при использовании консоли Rails, но без вмешательства человека).
Запуская cron один или два раза в день (или чаще, если вы хотите, чтобы электронные письма отправлялись чаще), скрипт найдет каждый оставленный без присмотра заказ, которому не менее 5 дней, и проведет его через ваш рабочий процесс. Поскольку ваш код (должен) переводить людей в новое состояние после срабатывания события not_received_by_5_days, они больше не будут отображаться при последующих выполнениях скрипта и получат только одно напоминание.
person
colinm
schedule
30.07.2013