ruby-on-rails - 减少 Rails 5 中的查询

标签 ruby-on-rails postgresql

我需要检索集合列表,即@medications、@treatments、@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 个查询。

所有模型都具有相同的名称、office_id 等属性

我想知道如何重组数据库以更好地使用或重组查询。顺便说一句,我正在使用 Postgres db v 9.6

最佳答案

连接和计数怎么样?

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.

关于ruby-on-rails - 减少 Rails 5 中的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49459401/

相关文章:

sql - 使用 Postgresql 合并连续的行

sql - PostgreSQL 如何禁用计划缓存来修复我的 base62 哈希?

ruby-on-rails - rails : How To Track Down A Method Called On An Array That Has No Such Method?

ruby-on-rails - rails : Good process for adding tests retroactively?

ruby-on-rails - 执行时出现名称错误 'rails s'

具有用户管理、日志记录和数据备份功能的 Postgresql 管理工具

java - 将数据从 PostgreSQL 迁移到 MongoDB

sql - 在 Postgresql 中的多个列上执行 WHERE IN

ruby-on-rails - 在 Rails 5.2.1 中安装 Webpacker 后,我立即收到 `can' t edit freeze Array` 错误

ruby-on-rails - 如何在 Ruby on Rails 中将 find_by_sql hstore 字符串转换为哈希值