Ruby on rails 从Rails应用程序内部监视数据库表的外部更改
我正在rails应用程序中集成一些非rails模型表。一切都很顺利,我建立模型的方式是:Ruby on rails 从Rails应用程序内部监视数据库表的外部更改,ruby-on-rails,activerecord,cron,delayed-job,observers,Ruby On Rails,Activerecord,Cron,Delayed Job,Observers,我正在rails应用程序中集成一些非rails模型表。一切都很顺利,我建立模型的方式是: class Change < ActiveRecord::Base establish_connection(ActiveRecord::Base.configurations["otherdb_#{RAILS_ENV}"]) set_table_name "change" end 类更改
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代码吗?我看了看延迟的工作,但是我不能完全理解如何设置它。我想象它是围绕一个cron作业发展起来的,它选择自上次运行作业以来创建的所有行,然后为每一行调用相应的Rails代码
更新目前正在研究Javan,看起来它可以解决“从cron部分运行rails代码”的问题。是的,您可能需要某种后台任务处理器(Delayed::Job是一种流行的处理器,或者您可以用Daemon库或类似的处理器来伪造自己的处理器)或者设置按某种计划运行的cronjob。如果您想经常(比如说每分钟)检查,我建议使用Delayed::Job路由,如果它更长(每小时左右),cron作业就可以了 按照DJ路线,您需要创建一个作业,该作业将检查新记录,如果有记录,则对其进行处理,然后重新对作业进行排序,因为每个作业在完成时都标记为“已完成”
-jon这就是我最后做的:使用,因为它与Capistrano很好地集成,并向我展示了如何从cron中运行Rails代码。我失去的平静基本上是
script/runner -e production 'ChangeObserver.recentchanges'
现在每5分钟运行一次。
recentchanges
从tmp文件中读取上次查看的ID,提取ID高于该ID的所有新的Change
记录,并为每个记录运行正常的观察者代码(当然,并将最高的查看ID保存到tmp文件)。与监视状态更改一样,有两种方法:轮询和通知。您现在似乎选择了轮询方式(让cron作业定期查看数据库的状态,如果状态发生变化,则执行一些代码)
你可以使用rails调度器中的一个来做同样的事情,还有一些(google会很容易找到它们,它们有各种各样的功能集,如果你这样做的话,我会让你选择一个适合你需要的)
您还可以根据您的数据库尝试采用通知方式。一些数据库同时支持触发器和外部进程执行或特定的通知协议。
在这种情况下,数据库本身会通知您表已更改。中的各种DBMS有许多这样的选项