很难确定如何在活动记录中构建此查询。我有以下两种型号:
class Event
has_many :event_times
end
class EventTime
belongs_to :event
end
EventTime有一个start_time时间戳。我想选择事件,使用分页并按EventTime start_time对它们进行排序。因此,事先有最快的事件发生的事件是第一次。我能够组合一个获取EventTime排序事件的查询,但由于事件可以有多个EventTimes,因此使用分页结果会产生不同数量的记录。
另一个解决方案是执行group_by,然后将分页应用于该结果。但是这需要将所有EventTime加载到不会扩展的内存中。
答案 0 :(得分:2)
不要害怕加入;只要您在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)