3

我在我的 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 的When,看起来它可以解决“从 cron 部分运行 rails 代码”。

4

3 回答 3

1

是的,你要么需要某种后台任务处理器(Delayed::Job 是流行的处理器之一,或者你可以使用 Daemon 库或类似的库来伪造你自己的),或者设置一个按某种时间表运行的 cronjob . 如果您想经常检查(例如每分钟),我建议您使用 Delayed::Job 路线,如果它更长(每隔一小时左右),cron 作业就可以了。

走 DJ 路线,您需要创建一个作业来检查新记录,如果有的话,处理它们,然后重新排队作业,因为每个作业在完成时都会被标记为“已完成”。

-乔恩

于 2010-04-02T19:47:22.737 回答
1

这就是我最终所做的:使用When,因为它与 Capistrano 很好地集成,并向我展示了如何在 cron 中运行 Rails 代码。我失去的平静基本上是

script/runner -e production 'ChangeObserver.recentchanges'

现在每 5 分钟运行一次。从 tmp 文件中recentchanges读取最后查看的 ID,提取所有Change具有更高 ID 的新记录,并为每个记录运行正常的观察者代码(并将最高查看的 ID 保存到 tmp 文件,课程)。

于 2010-04-14T08:36:29.237 回答
1

与监视状态更改一样,有两种方法:轮询和通知。您现在似乎选择了轮询方式(让 cron 作业定期查看数据库的状态,如果发生更改则执行一些代码)您可以使用其中一个 rails 调度程序来做同样的事情,那里有几个(谷歌很容易找到它们,它们有各种功能集,如果你有这种方法,我会让你选择适合你需要的那个)

您也可以尝试根据您的数据库采用通知方式。一些数据库同时支持触发器和外部流程执行或特定通知协议。在这种情况下,数据库本身会通知您该表已更改。在从数据库中获取事件中,各种 DBMS 有许多这样的选项

于 2010-04-14T08:56:01.430 回答