Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 从Rails应用程序内部监视数据库表的外部更改_Ruby On Rails_Activerecord_Cron_Delayed Job_Observers - Fatal编程技术网

Ruby on 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 类更改

我正在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代码吗?我看了看延迟的工作,但是我不能完全理解如何设置它。我想象它是围绕一个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有许多这样的选项