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

时间:2012-06-03 10:31:01

标签: ruby-on-rails

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

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

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

  1. 创建一个多态ActivityFeed模型,例如用户has_many :posts as: feedable。然后在相应的节目页面上呈现ActivityFeed集合。
  2. 创建并渲染组合数组,例如@user_feed = @user_photos + @user_comment +..
  3. 但我没有看到太多讨论每种方法的利弊。

    有没有其他人尝试类似的东西?在选择方法时,我应该考虑或计划哪些问题?每个表现的表现如何(特别是随着数据库变大)?

    我的要求是:

    1. 显示属于父模型的所有项目。
    2. 拥有多种不同类型的父模型(用户,机构,城市等)。
    3. 为活动供稿中的每个商品呈现不同的视图部分,具体取决于其类别。
    4. 感谢任何想法,个人经历或有关此进一步信息的指示。我应该寻找第三种选择吗?我对从多个查询创建组合数组的性能特别感兴趣。

      谢谢

1 个答案:

答案 0 :(得分:3)

让我再根据您的要求添加一些问题

  1. 易于显示属于父模型的所有项目
  2. 容易允许不同类型的父模型
  3. 依赖于类的模板渲染的简易性
  4. 轻松重构共享活动功能
  5. 易于集成潜在的活动控制功能(标记为已读,订阅,关注,共享等)
  6. 易于计算多态饲料,比如按各种活动的逆时间顺序计算。
  7. 易于计算父母的累计活动数
  8. 对于我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是微不足道的,而标准活动控制器也是如此。对于共享渲染部分,如快速列表视图/活动将是一个自然的地方。 使用counter_cache可以轻松完成7。 作为奖励,通过允许每种类型的has_many:活动,您可以区分活动类型,如创建,更新,阅读等。

    希望这会有所帮助