Ruby on rails Rails包括由具有多个关系的第一个关联方订购的
很难弄清楚如何在活动记录中构建此查询。我有以下两种型号:Ruby on rails Rails包括由具有多个关系的第一个关联方订购的,ruby-on-rails,rails-activerecord,Ruby On Rails,Rails Activerecord,很难弄清楚如何在活动记录中构建此查询。我有以下两种型号: class Event has_many :event_times end class EventTime belongs_to :event end EventTime有一个开始时间戳。我想使用分页选择事件,并按事件时间开始时间排序。所以事件时间最快的事件是第一个。我能够组合一个查询来获取按EventTime排序的事件,但是使用分页会导致不同数量的记录,因为一个事件可以有多个EventTime 另一种解决方案是执行group
class Event
has_many :event_times
end
class EventTime
belongs_to :event
end
EventTime有一个开始时间戳。我想使用分页选择事件,并按事件时间开始时间排序。所以事件时间最快的事件是第一个。我能够组合一个查询来获取按EventTime排序的事件,但是使用分页会导致不同数量的记录,因为一个事件可以有多个EventTime
另一种解决方案是执行group_by,然后对该结果应用分页。但这需要将所有事件时间加载到无法扩展的内存中 不要害怕加入;只要在
event\u times
表中为event\u id
设置了索引,它就会很快。您可以按事件分组,并按最短开始时间排序。分页可以通过向查询传递偏移量
和限制
数字来实现
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)
查询中是否也应考虑过去具有
事件时间的事件(即开始时间
)呢?EventTime上有一个结束时间。因此,是的,我包括过去有开始时间的事件时间,只要结束时间在未来。但这与手头的问题无关,而是你构建问题的方式。你说“最快的事件时间是第一个”。这意味着排序不应该是按开始时间
,而应该是开始时间
和时间之间的绝对差异。现在
,除非您过去没有将事件时间包含在开始时间
中。太好了。。。MIN()是我所缺少的。谢谢