Rails:如何显示用户的“最后一次看到”时间?

我正在使用存储current_sign_in_atlast_sign_in_at日期时间的设计。

但是,让我们说一位用户在一个月前登录但是上次在5分钟前查看了一个页面?

有没有办法可以显示( “用户上次见过5分钟前​​” )。

这个怎么样:

  1. 创建迁移以向用户添加新字段以存储上次用户的日期和时间:

     rails g migration add_last_seen_at_to_users last_seen_at:datetime 
  2. 向应用程序控制器添加before action回调:

     before_action :set_last_seen_at, if: proc { user_signed_in? } private def set_last_seen_at current_user.update_attribute(:last_seen_at, Time.current) end 

这样,在当前用户执行的每个请求(即活动)上,他/她最后一次看到的属性被更新为当前时间。

但请注意,如果您有许多用户登录,这可能会占用您应用程序的部分资源,因为这将在登录的某个人请求的每个控制器操作之前执行。

如果需要考虑性能,请考虑在步骤2中添加以下节流机制(在此示例中,在15分钟时进行限制):

 before_action :set_last_seen_at, if: proc { user_signed_in? && (session[:last_seen_at] == nil || session[:last_seen_at] < 15.minutes.ago) } private def set_last_seen_at current_user.update_attribute(:last_seen_at, Time.current) session[:last_seen_at] = Time.current end 

要改善以前答案的表现:

  • 不要使用会话,因为用户已经加载了warden并且可以访问所有属性
  • update_attribute运行回调并更新updated_at属性,而update_column不运行
  • 提高性能,更好地使用后台工作者,如ActiveJob / Resque / Sidekiq
  • 为了防止高DB锁定,最好创建一个单独的表,与users表关联,并在那里写访问

更新的代码:

 before_action :set_last_seen_at, if: proc { user_signed_in? && (user.last_seen_at.nil? || user.last_seen_at < 15.minutes.ago) } private def set_last_seen_at current_user.update_column(:last_seen_at, Time.now) end 

Devise插件会发生类似的行为(刚刚看到,没有优化): https : //github.com/ctide/devise_lastseenable