有了ActionCable,有没有办法计算一个频道内有多少订阅者?

时间:2016-07-23 14:23:49

标签: ruby-on-rails-5 actioncable

对于我建造的应用程序,我有一个" lobby"人们配置他们想要加入的区域的页面。非常基本。

我希望当前订阅此页面频道的活跃消费者总数,以便用户知道周围是否有其他人与之互动。

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:1)

我定义了一个辅助方法:

应用/信道/ application_cable / channel.rb

module ApplicationCable
  class Channel < ActionCable::Channel::Base

    def connections_info

        connections_array = []

        connection.server.connections.each do |conn|

            conn_hash = {}

            conn_hash[:current_user] = conn.current_user

            conn_hash[:subscriptions_identifiers] = conn.subscriptions.identifiers.map {|k| JSON.parse k}

            connections_array << conn_hash

        end

        connections_array

    end

  end
end

现在,您可以在派生频道内的任何位置拨打connections_info。该方法返回有关所有可用服务器套接字连接的信息数据,它们各自的current_user及其所有当前订阅。

以下是我的数据connections_info返回的示例:

[1] pry(#<ChatChannel>)> connections_info
=> [{:current_user=>"D8pg2frw5db9PyHzE6Aj8LRf",
  :subscriptions_identifiers=>
   [{"channel"=>"ChatChannel",
     "secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"},
    {"channel"=>"AppearanceChannel"}]},
 {:current_user=>
   #<User id: 2, email: "client1@example.com", created_at: "2017-03-27 13:22:14", updated_at: "2017-04-28 11:13:37", provider: "email", uid: "client1@example.com", first_name: "John", active: nil, last_name: nil, middle_name: nil, email_public: nil, phone: nil, experience: nil, qualification: nil, price: nil, university: nil, faculty: nil, dob_issue: nil, work: nil, staff: nil, dob: nil, balance: nil, online: true>,
  :subscriptions_identifiers=>
   [{"channel"=>"ChatChannel",
     "secret_chat_token"=>"f5a6722dfe04fc883b59922bc99aef4b5ac266af"}]}]

然后,您可以按照自己的方式解析此结构并提取所需的数据。您可以使用相同的current_usercurrent_user内的class Channel < ActionCable::Channel::Base方法)区分此列表中您自己的连接。

如果用户连接两次(或多次),则相应的数组元素只会加倍。

答案 1 :(得分:0)

是的,有一个:

在你的app / channel / what_so_ever_you_called_it.rb中:

class WhatSoEverYouCalledItChannel < ApplicationCable::Channel
     def subscribed
       stream_from "your_streamer_thingy"
       @subscriber +=1 #<==== like this
     end

     def unsubscribed
       # Any cleanup needed when channel is unsubscribed 
       @subscriber -=1 #<===== like this
     end
     def send_message(data)
        your_message_mechanic
     end

在订阅中设置变量增加 并且在取消订阅时减少。

您可能希望将值存储在“大厅”模型中,在这种情况下,“@subscriber”可能会被称为@ lobby.connected_total,我不知道,这是否符合您的需求。

但这是一种跟踪流数量的方法。

恩乔伊