按关联属性订购模型

ben*_*phw 5 activerecord ruby-on-rails

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

EventDate有一个start_time属性,Event有一个next_occurrence方法,用最近的方法查找属于它的EventDate start_time.

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

我想我可以用这样的东西来实现这个目标:

Event.joins(:event_dates).order('event_dates.start_time').limit(5)
Run Code Online (Sandbox Code Playgroud)

但这不对 - 如果我收集next_occurrence日期,它们就会失灵.

我怎么能查询这个以返回排序的事件next_occurrence

Bal*_*ick 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)
Run Code Online (Sandbox Code Playgroud)

解释:

为每个未来的Event最近的EventDate

EventDate.select('event_id, min(date) as next_event_date')
         .where('next_event_date > ?', Time.now)
         .group(:event_id)
Run Code Online (Sandbox Code Playgroud)

仅保留按顺序排列的前 5 个事件next_event_date

         .order(:next_event_date)
         .limit(5)
Run Code Online (Sandbox Code Playgroud)

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

         .includes(:event)
         .map(&:event)
Run Code Online (Sandbox Code Playgroud)