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 降序排序。
在我的 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 降序排序。