Как моделировать и хранить повторяющиеся задачи в рельсах?

Решения 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.

Другие вопросы по тегам