2010-04-01 60 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有很多这样的选项
相关问题