使用 ActionCable,有没有办法计算频道内有多少订阅者?

Gly*_*yph 5 ruby-on-rails-5 actioncable

对于我正在构建的应用程序,我有一个“大厅”页面,人们可以在其中配置他们想要加入的区域。非常基本。

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

是否有捷径可寻?

pro*_*ils 5

我定义了一个辅助方法:

应用程序/频道/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
Run Code Online (Sandbox Code Playgroud)

现在您可以connections_info在派生通道内的任何位置进行呼叫。current_user该方法返回有关所有可用服务器套接字连接、它们各自的s 以及所有当前订阅的信息数据数组。

这是我的数据返回的示例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"}]}]
Run Code Online (Sandbox Code Playgroud)

然后,您可以按照您想要的方式解析该结构并提取所需的数据。你可以通过相同的方式区分这个列表中你自己的连接current_usercurrent_user方法在里面class Channel < ActionCable::Channel::Base)。

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