Ruby on rails 最优雅的跟踪方式;“最后一次活动”;时间

Ruby on rails 最优雅的跟踪方式;“最后一次活动”;时间,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个网站,我需要能够显示在每个用户的个人资料上的最后一次“活跃”的网站。在这种情况下,“活动”是通过浏览内容、与其他用户交互以及完成课程来定义的 我的计划是在用户表上有一个last\u active列,我可以用时间更新它。现在。问题是,我如何做到这一点,而不在每次控制器操作期间访问数据库?那似乎。。。昂贵的。例如,我希望避免这样做: # In each controller def index current_user.activity end # In the User model

我有一个网站,我需要能够显示在每个用户的个人资料上的最后一次“活跃”的网站。在这种情况下,“活动”是通过浏览内容、与其他用户交互以及完成课程来定义的

我的计划是在用户表上有一个
last\u active
列,我可以用
时间更新它。现在
。问题是,我如何做到这一点,而不在每次控制器操作期间访问数据库?那似乎。。。昂贵的。例如,我希望避免这样做:

# In each controller
def index
  current_user.activity
end


# In the User model
def activity
  self.update_attribute(:last_active, Time.now)
end
因为每次用户获取内容列表时,我都必须进行数据库调用


另一个选项是有一个活动表,我用各种用户操作(有点像审计)更新它。这将允许我存储和显示有关用户正在做什么的更多相关信息。但这又回到了同一个问题:如何在不增加大量开销的情况下更新这些表?

这确实是一个没有实际意义的问题–不,如果不更新数据库,就无法更新数据库

如果您想变得复杂,您可以尝试执行一些客户端脚本来将该信息存储在会话变量或cookie中,并且偶尔只将其提交到db,但对于一个小功能来说,这似乎是一个很大的工作

如果您在
:last\u active
列中添加一个索引,可能会稍微降低成本?但如果不是这样的话,我会选择它,并尽量保守它的更新频率


您还可以在更新前检查
Time.now>@user.last_active+10.分钟
,以确保您没有不断向数据库写入数据,但是,您只需查询,这可能不是更好的…

我认为在更新特定用户的“最后一个活动”属性时,没有办法不限制开销

正如Charlie Egan提到的,你有两个选择:

  • 仅在用户登录时更新“上次活动”属性。通过这样做,您仍然可以很好地了解用户在站点上的一般活动

  • 仅更新某些活动的“上次活动”属性。例如,您在问题中提到,用户可以完成课程。这似乎是一个相当重要的“活动”,因此请更新“上次活动”属性。不太重要的活动,如浏览内容,可以忽略


  • 你不认为redis | memcache |内存中有任何存储这样的数据吗?

    如果你对异步更新没问题,你可以设置一个延迟的重新确认作业,删除以前的作业

    Resque.remove_delayed_selection RecordLastUserActivity, {
       |args| args[0]['user_id'] == current_user.id 
    }
    Resque.enqueue_at(10.minutes.from_now, RecordLastUserActivity, 
                 user_id: current_user.id, last_seen_at: Time.now)
    

    虽然不确定这是否能提供更好的性能,但它需要一些测试。

    我想问一个问题:这项功能有多重要?我们在过去使用过Deviate的最后一次登录属性。也许只在关键操作上执行最后一次活动更新?如果它不是那么重要,我会在会话中跟踪它,并且每次当前\u用户或获取当前\u用户的某个getter完成时,我都会用当前时间更新会话。这可以粗略估计用户活动。authlogic具有类似的自动魔法属性:last_request_at。除要记录“操作”的控制器/操作外,您可以禁用