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。除要记录“操作”的控制器/操作外,您可以禁用