Как запускать задачу rake при каждом изменении записи в модели? (лучшая практика)

#ruby-on-rails #performance #cron #rake

#ruby-on-rails #Производительность #cron #rake

Вопрос:

Я хочу запускать задачу cron rake при каждом обновлении записи — т.Е. Через некоторое время после создания / обновления новой записи задача cron rake выполнит некоторую обработку записи и сохранит результаты.

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

Каков наилучший способ программно определить, обработала ли задача rake уже определенную запись (и пользователь вообще ее не изменял)?

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

Спасибо за помощь, Алекс

Ответ №1:

Я думаю, вам следует использовать DelayedJob, а не Cron / Whenever.

В любом случае, вам не кажется, что было бы лучше сделать это при проверке или как до / после сохранения фильтра? Если бы вы реализовали эту функциональность как фильтр before_save, тогда вы могли бы использовать грязные атрибуты. Больше о грязных атрибутах вы можете найти здесь: http://ryandaigle.com/articles/2008/3/31/what-s-new-in-edge-rails-dirty-objects

Комментарии:

1. Спасибо за ваш ответ. Я не уверен, что грязные атрибуты справятся с этой задачей, я приведу вам пример (см. Ниже):

2. Пользователи могут настроить внешний вид «страниц» — например, изменить цвета. Фоновое задание должно сделать снимок этой страницы, используя внешний API. Я могу запускать эту задачу с отложенным заданием после каждого обновления, но пользователи могут протестировать множество цветовых комбинаций, прежде чем остановиться на одной. Если я использую DJ, мое приложение вызовет несколько фоновых заданий, что сильно усложнит ситуацию. Я подумал, что наиболее эффективный подход — запускать запланированную задачу каждые 3-4 часа, проверять наличие обновлений в записи, а затем запускать задачу. Если запись не изменилась, пропустите все задание, поскольку оно уже было запущено. Есть идеи?