我有一个使用Devise来认证用户的Rails应用程序,但我想要在平台上跟踪用户在线时间。我想在用户表中有一列保存该用户的在线时间(小时、分钟等)。例如,一个用户总共在线2个小时,另一个用户在线15分钟...
是否存在某些gem或Devise方法可以实现此功能?
提前致谢。
是否存在某些gem或Devise方法可以实现此功能?
提前致谢。
由于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)
您还可以添加一个额外的字段并保存当前在线时间。