2010-04-01 11 views
3

Я интегрирую некоторые таблицы не-рельсов в приложении Rails. Все работает очень хорошо, как настроить модель является:Таблица базы данных монитора для внешних изменений внутри приложения Rails

class Change < ActiveRecord::Base 
    establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"]) 
    set_table_name "change" 
end 

Таким образом, я могу использовать Change модель для всех существующих записей с find и т.д.

Теперь я хотел бы, чтобы запустить некоторые вид уведомления, когда запись добавляется в таблицу. Поскольку модель никогда не создается через Change.new и Change.save с использованием ActiveRecord::Observer, это не вариант.

Можно ли каким-либо образом получить код моего Rails, который будет выполнен, всякий раз, когда будет добавлена ​​новая запись? Я посмотрел на delayed_job, но не могу понять, как это сделать. Я предполагаю, что он развивается вокруг cron-job, который выбирает все строки, которые были созданы с момента последнего запуска задания, а затем вызывает соответствующий код Rails для каждой строки.

Обновление В настоящее время, глядя на Javan's Whenever, похоже, что он может решить «запустить рельсы кода из cron part».

ответ

1

Это то, что я наконец-то: использование Whenever, потому что он хорошо интегрируется с Capistrano и показал мне, как запустить Rails кода из хрон. Мой недостающий мир был в основном

script/runner -e production 'ChangeObserver.recentchanges' 

который теперь запускается каждые 5 минут. recentchanges считывает последний идентификатор look-at из tmp-файла, вытягивает все новые записи Change, у которых более высокий идентификатор, чем этот, и запускает нормальный код наблюдателя для каждой записи (и сохраняет наивысший искомый идентификатор в tmp-файле , конечно).

1

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

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

-jon

1

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

Вы также можете попробовать перейти по пути уведомления в зависимости от вашей базы данных. Некоторые базы данных поддерживают как триггеры, так и внешнее выполнение процесса или конкретные протоколы уведомлений. В этом случае вы сами уведомляетесь самой базой о том, что таблица изменилась. существует множество таких вариантов для различных СУБД в Getting events from a database