很难解决如何在活动记录中构建此查询。我有以下两种模型:
class Event
has_many :event_times
end
class EventTime
belongs_to :event
end
EventTime有一个start_time时间戳。我想使用分页来选择事件,并按EventTime start_time对其进行排序。因此具有EventTimes最快出现的事件是第一位。我能够将查询按EventTime排序,但由于事件可以具有多个EventTime,因此使用分页会导致记录数不同。
另一种解决方案是执行group_by,然后将分页应用于该结果。但这需要将所有EventTimes加载到不会扩展的内存中。
最佳答案
不要害怕加入。只要您在event_id
表上为event_times
设置了索引,它就很快。您可以按事件和按最小开始时间排序。分页可以通过将offset
和limit
编号传递给查询来实现。
Event
.select('event.*, MIN(event_times.start_time) AS min_start_time')
.joins(:event_times)
.group('event.id')
.order('min_start_time')
.offset(offset)
.limit(limit)