Rails 数据更改回调

Posted

技术标签:

【中文标题】Rails 数据更改回调【英文标题】:Rails callback on data change 【发布时间】:2014-11-27 19:41:12 【问题描述】:

我有 2 个不同的应用程序使用一个数据库。其中之一是 Rails 应用程序,仅作为显示数据的用户界面。

所以,我想以某种方式挂钩这一时刻,当另一个应用程序对数据库进行更改并执行 Rail 操作时(我想使用 websockets 并向每个侦听器发送这些新数据)。

那么,我该如何处理呢?如果我在 Rails 应用程序中更改模型,我可以使用 ActiveRecord Hooks。

那么,运行后台工作程序或类似的东西可能是个好主意?

或者,最好的办法是在没有 websockets 的情况下反复从 javascript 询问服务器?

【问题讨论】:

【参考方案1】:

如果第二个应用程序(修改 DB 中的数据)会在消息队列(Redis、RabbitMQ)中写入一些内容,我会更喜欢。

您的 Rails 应用程序将收到此事件并通知用户。

rails 应用程序和前端之间的最佳传输方式 - websockets。以http://faye.jcoglan.com/ 为例。

【讨论】:

【参考方案2】:

常见的是在某些端口上使用侦听器。以下是一些可以为您解决问题的库:

    Firehose Pusher

基本上所有人都有相同的想法:在after_commit 回调中向订阅了您应用程序特定端口的所有客户端发送一条注释。

【讨论】:

【参考方案3】:

嗯,谢谢大家的回答,我想我已经找到了最好的解决方案。

它使用新的 Rails4 功能 - SSE。

所以,我的控制器代码非常简单易懂:

class GaugeController < ApplicationController
include ActionController::Live

def index
    begin
        response.headers['Content-Type'] = 'text/event-stream'
        sse = SSE.new(response.stream, retry: 300, event: 'message')
        loop do
            #get data from model to modelData
            sse.write(modelData)
            sleep(0.5)
        end
    ensure
        sse.close
    end
end

结束

也许半秒调用 ActiveRecord - 太贵了,所以我可能会迁移到 Redis。

【讨论】:

以上是关于Rails 数据更改回调的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 5.1 之后,attribute_changed 是如何变化的?更改“验证”回调?

确定 Rails after_save 回调中更改了哪些属性?

如何知道 laravel 模型值是不是在保存回调时更改

你如何更改rails中的列数据类型?

Rails 5.2 数据表不会在页面更改时刷新数据

Ruby / Rails - 更改时间的时区,而不更改值