如何从多个模型创建(高性能)活动源



在Rails应用程序中,我想将多个模型组合成一个活动源。

例如,我有帖子,评论,照片,状态模型。每个都属于一个用户、一个机构和一个城市。在用户/机构/城市显示页面上,我想显示最新活动的时间顺序列表。

从阅读和关于SO的其他问题来看,似乎有两种思想流派。

  1. 创建一个多态的活动源模型,例如用户has_many :posts as: feedable。然后在相应的显示页上呈现活动源集合。
  2. 创建并渲染组合数组,例如 @user_feed = @user_photos + @user_comment +..

但是我还没有看到太多讨论每种方法的优缺点。

还有其他人尝试过类似的事情吗?在选择方法时,我应该考虑或计划哪些问题?每个性能如何(尤其是当数据库变大时)?

我的要求是:

  1. 显示属于父模型的所有项目。
  2. 具有几种不同类型的父模型(用户、机构、城市等)。
  3. 为活动源中的每个项目呈现不同的视图部分,具体取决于其类。

感谢任何想法、个人经历或对此的更多信息的指示。我应该寻找第三种选择吗?我对从多个查询创建组合数组的性能特别感兴趣。

谢谢

让我在您的要求中添加更多问题

  1. 易于显示属于父模型的所有项目
  2. 易于允许不同类型的父模型
  3. 易于呈现与类相关的模板
  4. 易于重构共享活动功能
  5. 易于集成潜在的活动控制功能(标记为已读、订阅、关注、共享等)
  6. 易于计算多态性饲料,例如按时间倒序排列各种类型的活动。
  7. 轻松计算父项上的聚合活动计数

对我来说,5 和 6 和 7 defo 提示它支持第一个选项,我的代码将是:

class Activity
  belongs_to :activity, polymorphic: true
  belongs_to :user, counter_cache: true
  belongs_to :institution, counter_cache: true
  belongs_to :city, counter_cache: true
end

城市新闻源的范围(演示 1、2、6)

city.activities.order('updated_at DESC').limit(20)

请注意,这只是对一个表的廉价搜索,它已经可以为您提供足够的快速列表,因为不需要关联加载(将.includes(:activities))来显示类似的东西。

Joe from NYU, New York has posted a comment
Mel from UCL, London has added a new photo

如果活动是一个单独的类,则 4 是微不足道的,而 5 对于标准活动控制器也很平滑。 对于共享渲染部分,如快速列表视图/活动将是一个自然的位置。7 很容易用counter_cache完成。作为奖励,通过允许每种类型的has_many:ACTIVITY,您可以区分活动类型,如创建,更新,读取等。

希望这有帮助

最新更新