我正在构建用户操作的活动日志。但主要目标是让所有活动不是每个用户,而是每页(范围)内部。我会在之后解释更多。
我关注并提出这个问题的主要方面是避免连接执行此操作并以可扩展性走向正确的方式
众所周知的活动日志设计方法:
因此,要获取所有用户活动,只需使用“user_id =?”列获取表。确定。
好。现在假设我的应用程序有很多关于名人的页面。用户可以将主题,问题(内部主题)添加到页面中。还可以更改页面名称,照片等。
页面的假设示例:/ stevejobs
嗯,这些活动仅在按 / stevejobs 页面分组时才有意义,因为它们需要在页面中显示 :
页面:Stevejobs
操作:
到目前为止,每个活动都有与活动和父对象相关的对象。 E.g:
When add question: {object_type: Question, object_id: 1, parent_type: Topic, parent_id: 1}
When add topic: {object_type: Topic, object_id: 1, parent_type: Page, parent_id: 1}
如果我想要获取 / stevejobs中发生的所有活动
,那么列父级可以有多个级别的深度,直到要加入的页面ID一种解决方案是添加2个名为“scope_type”和“scope_id”的额外多态列。
When add question: {object_type: Question, object_id: 1, parent_type: Topic, parent_id: 1, scope_type: Page, scope_id: 1}
When add topic: {object_type: Topic, object_id: 1, parent_type: Page, parent_id: 1, scope_type: Page, scope_id: 1}
因此,我认为可以更轻松地获取每页的所有活动
我可以处理什么?
我正在做的联接..
# All activities from Topics of page list_activities = Activity.joins("JOIN lists ON activities.item_id = topics.id and activities.item_type = 'Topic'") .joins("JOIN pages ON pages.id = topics.page_id") .where("pages.id = #{self.id}") # All activities from Question of Topic of Page document_activities = Activity.joins("JOIN documents ON activities.item_id = questions.id and activities.item_type = 'Question'") .joins("JOIN topics ON topics.id = questions.topic_id") .joins("JOIN pages ON pages.id = topics.page_id") .where("pages.id = #{self.id}")
然后结交。太丑了。最后序列化的列也避免了连接是没用的