加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails:观察控制器操作的模型更改

发布时间:2020-12-17 02:14:12 所属栏目:百科 来源:网络整理
导读:我想在调用控制器中的更新操作时(或者每当我的模型更新时)发出服务器发送的事件.我目前在具有虚拟发射器的同一控制器中有一个工作的监视动作: def watch self.response.headers["Content-Type"] = "text/event-stream" self.response.headers["Last-Modifie
我想在调用控制器中的更新操作时(或者每当我的模型更新时)发出服务器发送的事件.我目前在具有虚拟发射器的同一控制器中有一个工作的监视动作:

def watch
    self.response.headers["Content-Type"] = "text/event-stream"
    self.response.headers["Last-Modified"] = Time.now.ctime.to_json
    self.response_body = Enumerator.new do |y|
        100.times do |i|
            sleep 5
            y << ["event: message","data: #{i}nn"].join("n")
        end
    end
    # TODO catch IO error when client disconnects
end

如何在调用update时获得可生成/返回值的可枚举对象? (注意:它并不一定是一个Enumerable;但它确实必须响应#each才能使用这种流媒体技术.)从某种意义上讲,我试图在Rails中实现一个事件驱动的架构我猜.

我知道Observable但是我无法弄清楚如何让我的观察者可以根据需要进行枚举…或者如何在没有循环和睡眠定时器的情况下将观察者放入Enumerator(如上所述).

这样做的目的是对发送给当前登录的所有其他用户的数据库进行更改,以便每个用户始终具有数据库的当前反射.

谢谢-

解决方法

这不一定是最好的解决方案,但我最终创建了一个消息队列,如下所示:我在我的数据库中创建了一个新表(“SSE”),在我想要观察的模型中,我添加了回调:

class MyModel < ActiveRecord::Base
  after_save :queue_sse
  after_delete :queue_sse
  # ...
  private
    def queue_sse
      connected_users.each do |user|
        SSE.create(:changed_record_id => this.id,:user_id => user)
      end
    end
end

然后在观察行动中:

def watch
  connected_users << current_user # pseudo for a mutex-synched accessor
  self.response.headers["Content-Type"] = "text/event-stream"
  self.response.headers["Last-Modified"] = Time.now.ctime.to_json
  self.response_body = Enumerator.new do |y|
    loop do
      sleep 5
      ActiveRecord::Base.uncached do
        updates = SSE.find_all_by_user_id(current_user)
        updates.each do |update|
          puts "update found: #{update.id}n"
          y << ["event: message","data: #{update.id}nn"].join("n")
          update.destroy
        end
      end
    end
  end
  # TODO add error catching,and on IOError,remove the current_user
end

这会对数据库造成很大影响.它应该建立在memcached,互斥类变量或类似变量上.

(注意 – 需要线程,例如config.threadsafe!和线程服务器.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读