按关联属性订购模型

时间:2014-04-28 07:14:28

标签: ruby-on-rails activerecord

我有一个Event模型,它有很多EventDates。

EventDate具有start_time属性,并且事件具有next_occurrence方法,该方法使用最近的start_time查找属于它的EventDate。

我想找到next_occurrence排序的前5个事件(最快的第一个)。

我以为我可以通过以下方式实现这一目标:

Event.joins(:event_dates).order('event_dates.start_time').limit(5)

但这不对 - 如果我收集next_occurrence日期,则它们会出现故障。

如何查询此内容以返回next_occurrence订购的事件?

2 个答案:

答案 0 :(得分:2)

试试这个:

next_5_events = EventDate.select('event_id, min(date) as next_event_date')
                         .includes(:event)
                         .where('next_event_date > ?', Time.now)
                         .group(:event_id)
                         .order(:next_event_date)
                         .limit(5)
                         .map(&:event)

<强>解释

查找将来最近Event的每个EventDate

EventDate.select('event_id, min(date) as next_event_date')
         .where('next_event_date > ?', Time.now)
         .group(:event_id)

仅保留next_event_date

排序的5个首发事件
         .order(:next_event_date)
         .limit(5)

按原样,请求只返回event_idnext_event_date,因此以下行急切加载并返回Event个对象

         .includes(:event)
         .map(&:event)

答案 1 :(得分:1)

我无法尝试这一点,但我认为它有效。它在子查询中找到即将发生的事件,然后为您提供前5个。

Event.joins("(
  select event_dates.event_id, max(start_time)
  from event_dates
  group by event_dates.event_id
  order by max(start_time) desc
) as upcoming_events on events.id = upcoming_events.event_id")
.limit(5)