减少Rails中的查询5

时间:2018-03-23 23:03:08

标签: ruby-on-rails postgresql

我需要检索一个集合列表,即@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

1 个答案:

答案 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)

如果您计划依靠每种药物的每条记录,那么您可以使用joinscount传递记录并指定别名。

由于每个模型都有name和id列,因此你需要更精确地定义它们,并且在这种情况下分组(如果我错了,请纠正我)是强制性的,否则你会得到PG::GroupingError