"谁在线"使用Rails中的Devise

Zab*_*bba 40 devise ruby-on-rails-3

使用Devise on Rails,是否有一些方法可以列出当前有活动会话的所有用户,即当前登录的用户?

PS.我正在寻找一个强大的解决方案,而不是像这个问题中那样简单化的东西

小智 84

只需在ApplicationController中添加after_filter即可

after_filter :user_activity

private

def user_activity
  current_user.try :touch
end
Run Code Online (Sandbox Code Playgroud)

然后在用户模型中添加在线?方法

def online?
  updated_at > 10.minutes.ago
end
Run Code Online (Sandbox Code Playgroud)

你也可以创造范围

scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的建议.因为touch设置了updated_at列,所以如果您使用常规列updated_at来查看谁在线,则可能会产生误报.例如,调整某人的用户个人资料会错误地将其显示为在线10分钟.我们使用current_user.try(:touch,:last_response_at)并通过迁移将此新字段添加到数据库中.我们还在session#destroy上将其设置为nil,以便在用户明确注销时随时退出.最后但同样重要的是,我们确保为新字段添加索引. (21认同)
  • 这不会在每个动作上运行SQL吗? (12认同)

cti*_*ide 24

https://github.com/ctide/devise_lastseenable

您可以使用我编写的这个gem来存储用户的"last_seen"时间戳.从那里开始,显示过去5或10分钟内last_seen的用户非常简单.

  • User.where('last_seen>?',5.minutes.ago) (2认同)

Rya*_*Epp 20

如果你对每次访问数据库感到困扰.单.HTTP.请求.只有一些小窗口,你可以假设用户在线; 我有一个替代解决方案.

使用websockets和redis,可以可靠地将用户的在线状态提升到毫秒,而无需花费数十亿美元进行磁盘写入.不幸的是,它需要更多的工作,并有两个额外的依赖,但如果有人感兴趣我做了一个非常详细的写在这里:

如何判断用户是否在线?