Rails 4 - 按相关型号排序 created_at - activity

Rails 4 - order by related models created_at - activity

在我的 rails 应用程序中,我有几个相关模型,例如:

活动

has_many :comments
has_many :attendents
has_many :requests

我需要按 'created_at' 排序,但不仅是主模型(事件)还有相关模型,所以我将在列表顶部显示最近的 activity 即:评论、与会者、请求

因此,如果活动日期比任何评论、请求或参加者日期新,则该活动将排在最前面。 但是,如果有一个事件有较新的评论,那么这个事件将排在最前面等等。

我应该如何实现这样的排序?

编辑 数据库是 mysql

谢谢

Event
  .select("events.*")
  .joins("LEFT OUTER JOIN comments ON comments.event_id = events.id")
  .joins("LEFT OUTER JOIN attendents ON attendents.event_id = events.id" )
  .joins("LEFT OUTER JOIN requests ON requests.event_id = events.id")
  .group("events.id")
  .order("GREATEST(events.created_at, 
          MAX(comments.created_at),
          MAX(attendents.created_at),
          MAX(requests.created_at)) DESC")

如果我没有正确理解你的问题,就像这样

首先将其添加到您的相关模型中:

default_scope order('created_at DESC')

然后我会做一些分组:

@comments = Comment.all
@comments_group = @comments.group_by { |c| c.event}

在您看来,您将能够遍历每个块:

@comments_group.each do |event, comment|
  - event.name
  comment.each do|c|
    - c.body

我没有对此进行测试,但它应该会给你一个想法。

我会在 last_activity 的事件上放置一列,并通过从相关模型中触摸来维护它。

另一种方法是通过对其他表使用连接或子查询进行排序,这将需要一个数据库查询,其效率远低于简单地按 last_activity 降序排序。