Rails 4 - 按相关模型排序created_at - 活动

时间:2015-05-07 10:14:19

标签: mysql ruby-on-rails ruby-on-rails-4 rails-activerecord

在我的rails应用程序中,我的相关模型很少,例如:

活动

has_many :comments
has_many :attendents
has_many :requests

我需要的是通过' created_at'但不仅是主要模型(事件)而且还有相关模型,因此我将在最近活动的列表事件上显示,即:评论,参与者,请求

因此,如果活动日期比任何评论,请求或约会日期更新,则此活动将在最前面。 但是如果有一个更新评论的事件,那么这个评论就会出现在上面等等。

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

修改 db是mysql

谢谢

3 个答案:

答案 0 :(得分:2)

我会为last_activity的事件添加一个列,并通过触摸相关模型来维护它。

另一种方法是通过对其他表使用连接或子查询来进行排序,这将要求数据库查询的效率远低于仅通过last_activity降序排序。

答案 1 :(得分:1)

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")

答案 2 :(得分:0)

如果我理解你的问题,就像这样

首先将此添加到您的模型中:

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

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