3

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

例如,我有 Post、Comment、Photo、Status 模型。每一个都属于一个用户、一个机构和一个城市。在用户/机构/城市显示页面上,我想显示按时间顺序排列的最新活动列表。

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

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

但我没有看到太多讨论每种方法的利弊。

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

我的要求是:

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

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

谢谢

4

1 回答 1

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 :activities,您可以区分活动的类型,例如创建、更新、读取等。

希望这可以帮助

于 2012-06-03T14:07:43.027 回答