我有一个 Rails 应用程序,使用Devise进行身份验证的用户,但我希望在平台中跟踪在线用户的时间。我想在用户表中有一个列,可以节省此用户的在线时间(小时,分钟......)。例如,一个用户总共在线2小时,另一个用户15分钟......
是否存在一些用于此功能的gem或Devise方法?
提前致谢。
答案 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更多地说明了这一点。