我有一个模型Booking
,其中包含与Space
模型关联的space_id
属性belongs_to :space
。
现在我有多个空格,想根据每个ID计算每个预订。
我想获得从数据库一次又一次地发送记录的最佳方法,而无需一次又一次地进行火灾查询。 目前,我这样做:
spaces = Space.all
result = []
spaces.each do |s|
result << s.as_json.merge(:bookings_counts=>s.bookings.count)
end
但这是从数据库一次又一次地触发查询。 有没有最好的方法可以做到这一点?
这称为"N+1 查询"问题。在 Rails 中,您可以使用预先加载来解决这个问题。您可以使用includes
在单个查询中加载记录,方法是将代码的第一行更改为
spaces = Space.eager_load(:bookings)
这里有一个很好的解释和比较方法(includes
,eager_load
和preload
(在Rails链接中进行预先加载。