【问题标题】:Rails 4 - order by related models created_at - activityRails 4 - 按相关模型排序 created_at - 活动
【发布时间】:2015-05-07 10:14:19
【问题描述】:

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

事件

has_many :comments
has_many :attendents
has_many :requests

我需要的是按“created_at”排序,但不仅是主模型(事件),还有相关模型,所以我将显示在列表事件的顶部,最近的活动,即:cmets、参加者、请求

因此,如果活动日期比任何评论、请求或出席日期更新,则此活动将位于首位。 但是,如果有一个带有更新评论的事件,这个事件将排在首位等等。

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

编辑 数据库是 mysql

谢谢

【问题讨论】:

  • 你用什么数据库引擎?

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


【解决方案1】:

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

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

【讨论】:

  • 您也可以使用此方法,只需从关联模型中触摸 Event 上的 updated_at 列,而不是添加另一列。
【解决方案2】:
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")

【讨论】:

  • 我想你想按 max(events.created_at) 等订购。
  • 性能怎么样?我有大约 300 000 个事件的数据库,每个事件都有大约 5 个相关实体。
  • 性能将接近按created_at 排序的直接未索引事件,而连接表很小。但是大卫奥尔德里奇的回答可以显着改善last_activity_at上的索引
【解决方案3】:

如果我正确理解您的问题,类似这样的内容

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

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

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

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多