Ruby on rails 3 &引用;世卫组织';“s在线”;在轨道上使用装置

Ruby on rails 3 &引用;世卫组织';“s在线”;在轨道上使用装置,ruby-on-rails-3,devise,Ruby On Rails 3,Devise,使用Desive on Rails,是否有办法列出当前拥有活动会话的所有用户,即当前登录的用户 另外,我正在寻找一个健壮的解决方案,而不是像中那样简单化的解决方案 您可以使用我编写的这个gem来存储用户的“最后一次看到”时间戳。从这里开始,显示在过去5或10分钟内最后一次看到的用户就非常简单了。只需在ApplicationController中添加后过滤器即可 after_filter :user_activity private def user_activity current_us

使用Desive on Rails,是否有办法列出当前拥有活动会话的所有用户,即当前登录的用户

另外,我正在寻找一个健壮的解决方案,而不是像中那样简单化的解决方案


您可以使用我编写的这个gem来存储用户的“最后一次看到”时间戳。从这里开始,显示在过去5或10分钟内最后一次看到的用户就非常简单了。

只需在ApplicationController中添加后过滤器即可

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) }

我刚刚实现了这个的另一个版本,我想与大家分享一下,以防它对其他人有所帮助

我只需在“我的用户”表中添加一个
last\u sign\u out\u at
列,然后对Desive sessions controller进行子类化,这样我就可以覆盖destroy方法,在会话被销毁时设置它(用户注销):

#应用程序/控制器
类sessioncontroller
然后在我的用户模型中,我有一种方法来检查用户是否在线:

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
class用户最后签出时间:真
其他的
假的
结束
结束
结束

您还需要告诉Desive在路由中使用新的会话控制器

我们可以使用活动记录会话存储列出当前活动会话。请查看github应用程序页面。

如果您每天都要访问数据库。单身。http。要求只有一个小窗口,你可以假设用户在线;我有另一个解决办法

使用websockets和redis,可以可靠地获取用户的在线状态,最长可达毫秒,而无需对磁盘进行数十亿次代价高昂的写入。不幸的是,它需要更多的工作,并且有两个额外的依赖项,但是如果有人感兴趣,我在这里写了一篇非常详细的文章:


是否会设计出_lastseenable仍然可以使用rails 3.2和Desive 2.0?@Rubytastic我不知道,但这个解决方案非常简单,我宁愿使用它,也不愿添加额外的依赖项,这些依赖项可能会在rails或Desive的未来版本中中断。这不是会在每个操作上运行SQL吗?这是一个很好的建议。因为touch设置了updated_at列,如果您使用general列updated_at查看谁在线,则可能会产生误报。例如,调整某人的用户配置文件会在10分钟内错误地显示他们在线。我们使用了current_user.try(:touch,:last_response_at)并通过迁移将这个新字段添加到数据库中。我们还将sessions#destroy设置为nil,以便在用户明确注销时退出。最后但并非最不重要的一点是,我们确保为新字段添加索引。我喜欢这个解决方案,但在实现它时我有点困惑。如果我试图确定当前用户是否在线(假设他们有多个选项卡,并在其中一个选项卡上注销),是否有一种方法可以在不刷新页面的情况下使用此功能?能否给出在过去5或10分钟内最后一次看到的用户的显示代码?User.where('last_seen>?',5.minutes.ago)这不是一个很好的解决方案(至少不是唯一的解决方案),因为大多数用户不会注销,只需关闭浏览器或离开网站。也许你可以提供一些文档?我发现这个答案非常有用:可以包装成gem吗?谢谢!我在15分钟内完成了设置,效果很好!Ryan,你的博客文章很棒,但是你能在这里简单地总结一下吗?这样,如果你的博客/链接死了,你的方法就不会永远丢失了?
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