我最近在我的应用程序中添加了用户活动跟踪功能,该功能跟踪用户与多个模型的交互,以及每个模型中的几个不同操作。
class User
has_many :activities, :order => 'created_at desc'
def log_activity(object, type)
activities.create(:subject_type => object.class.name, :subject_id => object.id, :subject_action_type => type)
end
end
现在,在用户创建/更新/删除各种对象并在用户配置文件上显示此活动后,我会调用此方法。我想,在一段时间后,活动表将包含如此多的记录,它将达到影响加载时间的程度。我想知道以一种用户友好的方式管理它并保持数据库平稳运行是一个很好的实现。
我正在考虑设置某种计划任务,在x个时间后清理旧记录。也许您可以就如何实现这一点或建议更好的解决方案提出一些建议?
我使用 PostgreSQL 作为我选择的数据库。
答案 0 :(得分:0)
您的activities
延迟加载,因此除非您要求,否则不会引入所有相关活动。所以当你这样说时:
activities.create(...)
您对数据库所做的只是一次INSERT:没有select * from activities where ...
来构建activities
,只有来自create
调用的INSERT。
因此,您的log_activity
方法无需担心。
如果您想限制activities
表的大小,那么只需简单:
Activity.connection.execute("delete from activities where created_at < now() - interval '10 days'")
每隔一段时间就应该可以清除死木。 '10 days'
当然只是为了说明。