Правильный способ использования событий, созданных с помощью Ice Cube в Rails, с использованием ежедневного задания cron

Я хочу создать повторяющиеся события, используя жемчужину Ice Cube в Rails - мой вопрос в том, как правильно или правильно использовать эти повторяющиеся правила для запуска реальных событий?

Примером этого может служить повторяющийся счет-фактура.

Скажем, что у меня есть повторяемость Ice Cube, установленная один раз в неделю, и я сохранил ее в повторяющейся строке счета, используя to_yaml. Теперь у меня есть строка в базе данных с сериализованным правилом повторения. Единственный способ, который я могу себе представить, - это запустить каждую строку в базе данных, устранить сохраненные правила повторения и проверить, нужно ли ей запускать сегодня с помощью sched.occurs_on? (Date.new) - это затем будет помещено в cronjob, который работает ежедневно:

items = RecurringItem.find(:all)
items.each do |item|
    schedule = Schedule.from_yaml(item.schedule_yaml)
    if schedule.occurs_on?(Date.new)
        #if today is a recurrence, do stuff!
    end
end

Это выглядит ужасно неэффективным для меня, но я могу сделать это совершенно неправильно. Нет ли лучшего способа использования Ice Cube?

Ответ 1

Ice Cube, по-видимому, специализируется на настройке очень сложных графиков (происходит в 1-й и 4-й по счету, но только в том случае, если они равны числу дней, а не в выходные и т.д.)

Если это то, что вам нужно, то описанная вами задача, вероятно, является наиболее эффективным способом выполнения множества задач каждый день на таком сложном графике. Если вам не нужна эта сложность в ваших расписаниях, вы можете посмотреть на что-то вроде всякого (как упоминал Мэтьюфорд), который просто использует расписания cron для настройки задач, которые должны выполняться, но предназначенные для задач типа администратора, и поэтому требует файл конфигурации, который нужно отредактировать, и не работает, если вам нужно добавлять и удалять вещи через ваш интерфейс приложения.

Другой вариант использования Ice Cube - иметь ежемесячный cron, проходящий через каждое расписание, и настроить другую таблицу, определяющую, какие события должны выполняться в какие дни в течение следующего месяца. (каждая строка имеет дату и определение задачи), и ваш ежедневный cron мог бы выбрать из этой таблицы...

Вам также придется обновлять эту таблицу на один месяц раньше времени каждый раз, когда одно из списков изменено в приложении... вид хлопот, поэтому, если у вас нет сотен тысяч графиков, чтобы просматривать один раз в день, это, вероятно, не стоит проблемы.

Ответ 2

Поскольку вы используете ice_cube, вы можете посмотреть Sidetiq. Он использует ice_cube для указания планирования заданий, поэтому вам будет легко повесить.

Вместо того, чтобы проверять все записи, чтобы найти один из них, моя попытка состояла в том, чтобы генерировать запланированные события на основе этих правил, но я думаю, что есть много способов сделать это, может быть более эффективным.