Я вижу две возможности выполнить задачу в определенное время.
Фоновый процесс / Рабочий / ...
Это то, что вы уже сделали.Я реорганизовал ваш пример, потому что было две плохих вещи.
- Проверка условий непосредственно из вашей базы данных , это более эффективно, чем загрузка потенциально бесполезных данных
- Загрузка пользователей партиями .Представьте, что ваша база данных содержит миллионы пользователей ... Я уверен, что вы были бы счастливы, но не Rails ... совсем нет.:)
Кроме вашего кода я вижу еще одну проблему.Как вы собираетесь управлять этой фоновой работой на вашем производственном сервере?Если вы не хотите использовать Resque или что-то еще, вам следует подумать об управлении этим другим способом.Существует Monit и Бог , которые являются мониторами процесса.
while true
# Check the condition from your database
users = User.where(['last_sent_at < ? OR created_at IS NULL', 24.hours.ago])
# Load by batch of 1000
users.find_each(:batch_size => 1000) do |u|
u.generate_and_deliver_dailysummery
end
sleep 60
end
Задания Cron/ Запланированное задание / ...
Вторая возможность - это рекурсивное планирование вашего задания, например, каждый час или полчаса.Поправьте меня, если я ошибаюсь, но действительно ли вашим пользователям нужно планировать доставку на 10:39?Я думаю, что пусть они выберут час, достаточно .
Применяя это, я думаю, что работа, выполняемая каждый час, лучше , чем бесконечная задача, запрашивающая вашу базу данных каждыйминута.Более того, это действительно легко сделать , потому что вам не нужно ничего настраивать.
Существует хороший гем для управления задачей cron с синтаксисом ruby.Больше информации здесь: Всякий раз