我正在构建用户操作的活动日志。但主要目标是获取所有活动,而不是每个用户,而是每个页面(范围)内部。后面我会解释更多。
我关心并提出这个问题的主要问题是避免加入来执行此操作并以可扩展性的方式走向正确的道路
众所周知的活动日志设计方法:
因此,要获取所有用户活动,它的全部内容就是使用“user_id = ?”列获取表。好的。
出色地。现在假设我的应用程序有很多关于名人的页面。用户可以在页面中添加主题、问题(主题内)。还可以更改页面的名称、照片等。
页面的假设示例:/stevejobs
好吧,这些活动仅在按/stevejobs页面分组时才相关,因为它们需要出现在页面内:
页: 史蒂夫乔布斯
行动:
- 用户 1 添加一个问题“史蒂夫乔布斯是什么时候出生的?” 关于“关于”的话题
- 用户 2 将页面名称编辑为“Steve Jobs”
- 用户1添加了话题“生活”
到目前为止,每个活动都有与活动相关的对象和父对象。例如:
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
一种解决方案是添加两个名为“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}")
然后建立一个联盟。太丑了。最后序列化的列也避免连接是无用的