很难解决如何在活动记录中构建此查询。我有以下两种模型:

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设置了索引,它就很快。您可以按事件和按最小开始时间排序。分页可以通过将offsetlimit编号传递给查询来实现。

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)

10-04 18:49