我有一个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
订购的事件?
答案 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
.order(:next_event_date)
.limit(5)
按原样,请求只返回event_id
和next_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)