Как моделировать и хранить повторяющиеся задачи в рельсах?
Решения Cron в рельсах многочисленны и довольно хороши. Это не то, с чем я борюсь здесь.
Вместо этого у меня возникают проблемы с тем, чтобы позволить пользователям создавать свои собственные повторяющиеся задачи (например, напоминания) - в частности, как моделировать и хранить их в БД (хороший интерфейс для этого тоже нетривиален) - было бы здорово, если бы код там для этого). Отличным примером здесь является календарь Google (пользовательский интерфейс для добавления события, а не весь календарь)... они должны быть в состоянии делать это ежедневно в 13:00 по московскому времени, или в понедельник / субботу / воскресенье, или еженедельно, и т. Д. Какое бы ни было решение cron для его использования потребуется опросить базу данных, чтобы узнать, какие напоминания необходимо отправить в этот час и т. д.
Кто-нибудь видел хороший плагин / драгоценный камень для этого в рельсах? Кажется, что-то было бы для этого, но я еще не нашел это.
Спасибо!
4 ответа
Я закончил тем, что катил свое собственное решение, так как мне не нужно ничего сверхъестественного.
В основном я добавил next_run
дата и время interval
строковый столбец в БД, который был одним из (день, неделя и т. д.). Затем установите для запуска задание cron, которое ищет next_run
даты, которые прошли Он запускает их, а затем устанавливает next_run
в какой-то момент в будущем на основе interval
колонка.
Просто, но сработало для моих нужд.
Я всегда считал, что оптимальные решения (RFC, а не программа) - это лучший подход для работы с повторяющимися событиями. Есть несколько хороших библиотек Ruby для работы с ical, и самым новым ребенком в блоке является ri_cal.
В настоящее время думаю об использовании такого плагина для хранения повторений в таблице http://github.com/fnando/recurrence/tree/master
каждое напоминание будет иметь один повторяющийся объект, и напоминание также будет содержать поле даты и времени, когда предполагается отправлять его следующим. Тогда cron может...
get all reminder's whose "next_send" date has passed
for each reminder
send it
update the "next_send" field using the recurrence object
end
Если есть лучшие решения или я иду по неверному пути, вход всегда приветствуется.
В настоящее время у меня есть эта проблема, и решение, которое я рассматриваю, заключается в следующем:
class AllowReoccuringTasks < ActiveRecord::Migration
def self.up
add_column :tasks, :reoccuring, :boolean
add_column :tasks, :period, :integer
end
end
где период может быть 1 (каждый день), 7 (каждая неделя) или 14 (каждая вторая неделя).
Если вы хотите поддерживать другие типы расписаний, такие как каждый месяц, будни, выходные и т. Д., Вы можете вместо этого добавить столбец с названием "расписание" и использовать константы для представления различных типов расписаний. Вы также можете использовать плагин enum.