Rails回调数据变化

时间:2014-11-27 19:41:12

标签: ruby-on-rails websocket rails-activerecord

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

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

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

所以,好主意可能是运行后台工作者,或类似的东西?

或者,可能最好的想法是在没有websockets的情况下从javascript中重复询问服务器?

3 个答案:

答案 0 :(得分:0)

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

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

rails app和frontend之间的最佳传输 - websockets。例如,使用http://faye.jcoglan.com/

答案 1 :(得分:0)

常见的是在某些端口上使用列表器。这里有几个可以帮你解决问题的库:

  1. Firehose
  2. Pusher
  3. 基本上所有人都有相同的想法:在after_commit回调中向在应用程序的某个端口订阅的所有客户发送一个备注。

答案 2 :(得分:0)

好的,谢谢大家的回答,我认为我找到了最好的解决方案。

它使用新的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。