如何追踪用户在线时间?使用Ruby on Rails。

4
我有一个使用Devise来认证用户的Rails应用程序,但我想要在平台上跟踪用户在线时间。我想在用户表中有一列保存该用户的在线时间(小时、分钟等)。例如,一个用户总共在线2个小时,另一个用户在线15分钟...
是否存在某些gem或Devise方法可以实现此功能?
提前致谢。

你可以每1秒向服务器发送一个AJAX请求来更新“在线时间”。确保服务器不允许每秒成功超过一次的请求。 - max pleaner
2个回答

2

由于DEVICE在用户登录并成为在线状态后立即将last_sign_in_at存储起来。

你可以像这样做。

添加一个migration来更改用户表并添加一个字段total_online_time

rails g migration add_total_online_time_to_users total_online_time:Float

在应用控制器中添加一个before action回调函数来检查用户操作:

before_action :set_online_time, if: proc { user_signed_in? }

在这个方法中,我会获取last_sign_in_at和当前时间的差异,并将其以分钟和秒钟的形式存储在数据库中。

再次登录时,我会将此时间添加到旧时间上。

目前我正在保存分钟和秒数。因为我不能直接添加两个时间。

编辑:

我之所以保存在分钟中,是因为如果我们在数据库中保存字符串或时间,我们无法在运行时将最后一个值加上当前值。所以就是这种情况。

def set_online_time

  start_time = current_user.last_sign_in_at.to_time;
  end_time = Time.now;

  if(start_time && end_time)_
      minutes = time_diff(start_time, end_time)
      if(current_user.total_online_time)
        minutes = current_user.total_online_time + minutes
      current_user.update_attribute(:total_online_time, minutes)
  end  

end

以下是操纵时间的方法:

private


def time_diff(start_time, end_time)
    (start_time -  end_time) / 60
end

现在,从 DB 中检索分钟数并转换为 HH:MM:SS

以下是实现方法,

Time.at(seconds).utc.strftime("%H:%M:%S")

所以,Time.at((current_user.total_online_time) * 60).utc.strftime("%H:%M:%S") 就是你要的结果。

这里有一个示例:

time1 = Time.now   => 2017-01-27 18:01:42 +0530

time2= Time.now - 4.hours  => 2017-01-27 14:02:02 +0530

minutes = time_diff(time1,time2)  => 239.66325946553334

Time.at((minutes) * 60).utc.strftime("%H:%M:%S") => "03:59:39"

So, "03:59:39" is the online time.

注意:

1)每当用户登录时,此答案会不断增加用户的在线时间。

2)如果您只想要最后一次登录时间,请使用:

minutes = time_diff(start_time, end_time)
current_user.update_attribute(:total_online_time, minutes)

您还可以添加一个额外的字段并保存当前在线时间。


@Jose,你看过我的答案了吗?就这个问题需要解释吗? - Sravan
能否在一天内添加在线总时间,例如IST上午9点到晚上7点的营业时间? - rahoolm

1
你可以在用户表中添加两个字段:last_login_time和hours_logged。 每当用户登录时,您保存其时间到last_login_time。每当用户注销时,您计算总共花费的时间并添加到hours_logged中。
要做到这一点,您可以覆盖devise控制器方法并添加这些任务。这个QA更多地讲解了这个问题。

登录时间!=在线时间。例如,我从不注销网站。 - Sergio Tulentsev
同意,在线时间不取决于登录/注销操作,而更多地取决于“用户在页面上的时间段”。 - Rubén T.F.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接