我正在我的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的Whenever,看起来它可以解决'来自cron part的'运行轨道代码'。
答案 0 :(得分:1)
是的,你要么想要某种后台任务处理器(延迟:: Job是流行的那个,或者你可以用守护进程库或类似的东西伪装自己)或者设置一些运行在某些上的cronjob时间表。如果你想经常检查(每分钟,比方说),我建议使用Delayed :: Job路线,如果它更长(每小时左右),一个cron工作就可以了。
走DJ路线,您需要创建一个检查新记录的作业,如果有的话,处理它们,然后重新排队,因为每个作业在完成后都标记为“已完成”。
-Jon
答案 1 :(得分:1)
这就是我最终做的:使用Whenever,因为它与Capistrano很好地集成,并向我展示了如何从cron中运行Rails代码。我失去的和平基本上是
script/runner -e production 'ChangeObserver.recentchanges'
现在每5分钟运行一次。 recentchanges
从tmp文件中读取最后一个查找的ID,提取ID高于该值的所有新Change
记录,并为每条记录运行正常的观察者代码(并保存最高的查找-at ID到tmp文件,当然)。
答案 2 :(得分:1)
与监控状态更改一样,有两种方法:轮询和通知。您似乎现在选择了轮询方式(有一个cron作业定期查看数据库的状态并执行一些代码,如果更改) 您可以使用其中一个rails调度程序执行相同的操作,其中有一些(google会很容易找到它们,它们有各种功能集,如果你这样,我会让你选择一个适合你需要的功能集)
您还可以尝试根据您的数据库进行通知。某些数据库支持触发器和外部进程执行或特定通知协议。 在这种情况下,数据库本身会通知您表已更改。 Getting events from a database
中的各种DBMS有很多这样的选项