【发布时间】:2011-07-27 02:57:51
【问题描述】:
使用 Devise on Rails,有没有办法列出所有当前有活动会话的用户,即当前登录的用户?
附言。我正在寻找一个强大的解决方案,而不是像this question 中的那些简单化的解决方案
【问题讨论】:
-
我发现这个答案非常有用:stackoverflow.com/questions/20821341/…
使用 Devise on Rails,有没有办法列出所有当前有活动会话的用户,即当前登录的用户?
附言。我正在寻找一个强大的解决方案,而不是像this question 中的那些简单化的解决方案
【问题讨论】:
https://github.com/ctide/devise_lastseenable
您可以使用我编写的这个 gem 来存储用户的“last_seen”时间戳。从那里,显示最近 5 或 10 分钟内最后一次看到的用户非常简单。
【讨论】:
只需在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) }
【讨论】:
我刚刚实现了另一个版本,我想分享一下,以防它帮助其他人。
我只是在我的 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 控制器。
【讨论】:
我们可以使用活动记录会话存储列出当前活动会话。请查看github应用页面https://github.com/mohanraj-ramanujam/online-users。
【讨论】:
如果您对每次访问数据库感到困扰。单身的。 http。要求。只是有一些小窗口,您可以在其中假设用户在线;我有一个替代解决方案。
使用 websockets 和 redis 可以可靠地获取高达毫秒的用户在线状态,而无需进行 10 亿次昂贵的磁盘写入。不幸的是,它需要更多的工作并且有两个额外的依赖项,但是如果有人感兴趣,我在这里做了一个非常详细的写:
【讨论】: