我需要检索一个集合列表,即@medications,@ measure,@therapies等,并计算每个集合相关记录的数量。
这有效,但会为每个相关记录计数创建初始查询,然后创建新查询。有没有办法可以最大限度地减少查询次数?
@medications = Medication.includes(:records).select(:id, :name).where(office_id: current_user.selected_office)
@medications.each do |medication|
medication.record_count = medication.records.count
end
如果@medications查询有10个结果我总共有11个查询。我需要10个具有相关记录数的集合,因此每个请求最终会有110个查询。
所有模型都具有相同的name,office_id等属性
我想知道如何重构数据库以更好地使用或重构查询。顺便说一句,我使用的是Postgres db v 9.6
答案 0 :(得分:1)
加入和计数怎么样?:
Medication.left_outer_joins(:records)
.select('medications.name, medications.id, COUNT(records.id) AS records_count')
.group(:id)
.where(office_id: current_user.selected_office)
如果您计划依靠每种药物的每条记录,那么您可以使用joins
和count
传递记录并指定别名。
由于每个模型都有name和id列,因此你需要更精确地定义它们,并且在这种情况下分组(如果我错了,请纠正我)是强制性的,否则你会得到PG::GroupingError
。