Как моделировать и хранить повторяющиеся задачи в рельсах? - PullRequest
6 голосов
/ 21 июля 2009

Решения Cron в рельсах многочисленны и довольно хороши. Это не то, с чем я борюсь здесь.

Вместо этого у меня проблемы с тем, чтобы позволить пользователям создавать свои собственные повторяющиеся задачи (например, напоминания) - в частности, как моделировать и хранить их в БД (хороший пользовательский интерфейс для этого нетривиален тоже - было бы здорово если бы там был код для этого). Отличным примером здесь является календарь Google (пользовательский интерфейс для добавления события, а не весь календарь) ... они должны быть в состоянии делать это ежедневно в 13:00 по московскому времени, или в понедельник / среду / пятницу, или еженедельно, и т. Д. Какое бы решение cron не было для его использования потребуется опросить базу данных, чтобы узнать, какие напоминания необходимо отправить в этот час и т. д.

Кто-нибудь видел хороший плагин / гем для этого в рельсах? Похоже, что-то там будет, но я пока не нашел.

Спасибо!

Ответы [ 4 ]

6 голосов
/ 19 октября 2010

Я закончил тем, что катил свое собственное решение, так как мне не нужно было ничего сверхъестественного.

В основном я добавил строковый столбец next_run datetime и interval в базу данных, которая была одной из (день, неделя и т. Д.). Затем настройте для запуска задание cron, которое ищет все прошедшие даты next_run. Он запускает их и затем устанавливает next_run на какой-то момент в будущем на основе столбца interval.

Просто, но сработало для моих нужд.

1 голос
/ 21 июля 2009

Я всегда считал, что наиболее подходящим решением для работы с повторяющимися событиями являются решения (RFC, а не программа). Есть несколько хороших библиотек Ruby для работы с ical, и самым новым ребенком в блоке является ri_cal .

1 голос
/ 21 июля 2009

В настоящее время думаю об использовании такого плагина для хранения повторений в таблице. http://github.com/fnando/recurrence/tree/master

каждое напоминание будет иметь один повторяющийся объект, и напоминание также будет содержать поле даты и времени, когда предполагается отправлять его следующим. Тогда крон мог бы ...

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

Если есть лучшие решения или я иду по неверному пути, ввод всегда приветствуется.

0 голосов
/ 03 ноября 2010

У меня сейчас проблема, и решение, которое я рассматриваю, заключается в следующем:

class AllowReoccuringTasks < ActiveRecord::Migration  
    def self.up  
        add_column :tasks, :reoccuring, :boolean  
        add_column :tasks, :period, :integer  
    end
end

где период может быть 1 (каждый день), 7 (каждая неделя) или 14 (каждая вторая неделя).

Если вы хотите поддерживать другие типы расписаний, такие как каждый месяц, будни, выходные и т. Д., Вы можете вместо этого добавить столбец с названием «расписание» и использовать константы для представления различных типов расписаний. Вы также можете использовать enum plugin .

...