使用Devise on Rails,有没有办法列出当前有活动会话的所有用户,即当前登录的用户?
聚苯乙烯。我正在寻找一个强大的解决方案,而不是像this question
中那样简单化的解决方案答案 0 :(得分:84)
只需在ApplicationController中添加after_filter
即可after_filter :user_activity
private
def user_activity
current_user.try :touch
end
然后在用户模型中添加在线?方法
def online?
updated_at > 10.minutes.ago
end
你也可以创建范围
scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
答案 1 :(得分:24)
https://github.com/ctide/devise_lastseenable
您可以使用我编写的这个gem来存储用户的'last_seen'时间戳。从那里开始,显示过去5或10分钟内last_seen的用户非常简单。
答案 2 :(得分:20)
如果您对每次访问数据库感到困扰。单。 HTTP。请求。只有一些小窗口,你可以假设用户在线;我有另一种解决方案。
使用websockets和redis,可以可靠地将用户的在线状态提升到毫秒级,而无需花费数十亿美元进行磁盘写入。不幸的是,它需要更多的工作,并有两个额外的依赖,但如果有人感兴趣我在这里做了一个非常详细的写:
答案 3 :(得分:1)
我刚刚实现了另一个版本,并且认为我会分享它以帮助其他任何人。
我只需在我的Users表中添加一个last_sign_out_at
列,然后将Devise会话控制器子类化,这样我就可以覆盖destroy方法,以便在会话被销毁时设置它(用户注销):
# app/controllers
class SessionsController < Devise::SessionsController
def destroy
current_user.update_attribute(:last_sign_out_at, Time.now)
super
end
end
然后在我的用户模型中,我有一种检查用户是否在线的方法:
class User < ActiveRecord::Base
def online?
if current_sign_in_at.present?
last_sign_out_at.present? ? current_sign_in_at > last_sign_out_at : true
else
false
end
end
end
此外,您需要告诉Devise在您的路线中使用新的Sessions控制器。
答案 4 :(得分:0)
我们可以使用活动记录会话存储列出当前活动会话。请查看github应用页面https://github.com/mohanraj-ramanujam/online-users。