如何跟踪一个用户在线的时间?使用Ruby on Rails

时间:2017-01-27 10:50:11

标签: ruby-on-rails devise

我有一个 Rails 应用程序,使用Devise进行身份验证的用户,但我希望在平台中跟踪在线用户的时间。我想在用户表中有一个列,可以节省此用户的在线时间(小时,分钟......)。例如,一个用户总共在线2小时,另一个用户15分钟......

是否存在一些用于此功能的gem或Devise方法?

提前致谢。

2 个答案:

答案 0 :(得分:2)

由于DEVICE会在用户登录帐户后立即存储last_sign_in_at并成为online

你可以这样做。

添加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并且因为我有当前时间,我会得到这些时间的差异并以DB存储为分钟和秒。

同样,如果他登录,我会将这段时间添加到旧时间。

目前我正在保存分钟和秒。因为我无法直接添加两次。

修改

我在几分钟内保存,因为如果我们在数据库中保存字符串或时间,我们就无法在旅途中添加最后一个值加上当前值。情况确实如此。

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

HEre是操纵时间的方法:

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)

您还可以占用额外的字段并节省当前在线时间。

答案 1 :(得分:1)

您只需在用户表中添加两个字段:last_login_time和hours_logged。 只要用户登录,您就可以将时间保存在last_login_time上。每当用户注销时,您都会计算花费的总时间并将其添加到hours_logged。

要执行此操作,您可以覆盖设计控制器方法并添加这些任务。其他QA更多地说明了这一点。