count有很多查询记录

cdmah0mi  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(643)

如果我有一个模特 has_many 关系,如何检索查询中所有记录指向的所有记录?
比如说,建筑物和房间有很多关系。我想做的是:

Building.where(...query...).rooms.count

这只是一个例子。我可能想要计算它们,或者我可能想要一个与查询匹配的建筑物所属房间的activerecord。
一种方法是这样,但我想知道是否有更好的方法:

building_ids = Building.where(...query...).pluck(:id)
Room.where(building_id: building_ids).count
cetgtptt

cetgtptt1#

使用 select 而不是 pluck 将导致一个sql语句,而不是两个单独的sql语句。

building_ids = Building.where(...).ids
Room.where(building_id: building_ids)

你也可以使用 join ```
Room.joins(:building).where(building: { name: 'somename' })

wbgh16ku

wbgh16ku2#

我会使用计数器缓存的总和。
在迁移中添加计数器缓存列:

add_column :buildings, :rooms_count, default: 0

更新房间中的关系:

belongs_to :building, counter_cache: true

然后你可以这样做:

Building.sum(:rooms_count)

这将避免n+1查询
更多详情请点击此处https://blog.appsignal.com/2018/06/19/activerecords-counter-cache.html

相关问题