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 是如何变化的?更改“验证”回调?