2010-04-01 61 views
3

我在Rails應用程序中集成了一些非Rails模型表。一切工作也很完美,我建立模型的方法是:從Rails應用程序中監控數據庫表的外部變化

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

這樣我可以使用Change模型對所有現有的記錄與find

現在,我想運行一些當記錄被添加到表中時的通知類型。由於模型永遠不會通過Change.newChange.save使用ActiveRecord::Observer創建不是一個選項。

有沒有什麼辦法可以讓我的一些Rails代碼被執行,每當添加新記錄時?我看着delayed_job,但無法讓我的頭腦,如何設置。我想它圍繞着一個cron-job展開,它選擇自上次作業之後創建的所有行,然後爲每行調用相應的Rails代碼。

更新目前看着Javan的Whenever,看起來像它可以解決從'cron部分'的運行軌代碼。

回答

1

這就是我終於做到:使用Whenever,因爲它與Capistrano的完美集成在一起,並教我如何從cron中運行Rails代碼。我失蹤的和平基本上是

script/runner -e production 'ChangeObserver.recentchanges' 

現在每5分鐘運行一次。 recentchanges從tmp文件中讀取最後一次查看的ID,拉取所有具有更高ID的記錄,併爲每個記錄運行正常觀察者代碼(並將最高查看ID保存到tmp文件中, 當然)。

1

是的,你要麼需要某種後臺任務處理器(Delayed :: Job是其中一種流行的處理器,或者你可以用Daemon庫或類似工具僞造你自己的)或者設置一個運行於其上的cronjob某種時間表。如果你想經常檢查(每分鐘,說),我會推薦Delayed :: Job的路線,如果它更長(每個小時左右)一個cron作業就可以做到。

去DJ的路線,你需要創建一個工作,檢查新記錄,如果有任何處理,然後重新工作,因爲每個工作完成後標記爲「完成」。

-Jon

1

像往常一樣監視狀態變化,有兩種方法:輪詢和通知。你似乎已經選擇了現在的輪詢方式(有一個cron作業定期查看數據庫的狀態並執行一些代碼,如果更改的話) 你可以使用其中一個rails調度器來做同樣的事情,有幾個在那裏(谷歌會很容易地找到他們,他們有各種功能集,我會讓你選擇一個適合你的需要,如果你有這種方式)

你也可以嘗試去通知方式取決於你的數據庫。某些數據庫支持觸發器和外部流程執行或特定的通知協議。 在這種情況下,數據庫本身會通知您該表已更改。 Getting events from a database

對於各種DBMS有很多這樣的選項
相關問題