Rails有效地查询记录和最新的关联记录,包括吗?

惊惧

我在使用rails activerecord查询时遇到问题。

我有2张桌子。

一个项目:

id | name | created_at | updated_at

一个用于项目报告:

id | project_id | number | created_at | updated_at

Project的相应类:

class Project < ActiveRecord::Base
  has_many :project_reports

  def latest_report_number
    project_reports.last.number
  end
end

和ProjectReports:

class ProjectReport < ActiveRecord::Base
  belongs_to :project
end

我正在尝试编写查询以获取项目列表和该项目的最新报告。

我可以通过以下方式执行此操作,但这会导致N + 1情况:

Project
  .select("projects.*, max(project_reports.created_at) as latest_report")
  .joins(:project_reports)
  .order("latest_report desc")
  .group("projects.id")
  .map { |p| "#{p.name}: #{p.latest_report_number}" }

因此,我想使用rails的“ includes”功能,以免遇到N + 1情况:

Project
  .select("projects.*, max(project_reports.created_at) as latest_report")
  .joins(:project_reports)
  .order("latest_report desc")
  .group("projects.id")
  .includes(:project_reports)    # <----
  .map { |p| "#{p.name}: #{p.latest_report_number}" }

这导致我的查询不再起作用:

PG::GroupingError: ERROR:  column "project_reports.id" must appear in 
the GROUP BY clause or be used in an aggregate function

如何编写查询,以便既完成目标又限制我访问数据库的次数(理想情况下是包含)?

阿马科洛德

includes联接查询的情况下,从关联表中请求额外的列(即tasks),以便在不进行额外查询的情况下构建关联的对象。通常,这是一个受欢迎的优化,但是对于GROUP BY子句,您最终会看到invalid SELECT

在您的情况下,您需要一个完全独立的查询来加载关联,因此preload是一个更好的选择。

Project
  .select("projects.*, max(project_reports.created_at) as latest_report")
  .joins(:project_reports)
  .order("latest_report desc")
  .group("projects.id")
  .preload(:project_reports)
  .map { |p| "#{p.name}: #{p.latest_report_number}" }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CNAME记录被通配符CNAME记录有效地忽略和覆盖

来自分类Dev

如何有效地将记录存储为Ember查询参数

来自分类Dev

有效地找到记录的子集以及总数

来自分类Dev

哪种技术更有效地替换记录

来自分类Dev

CosmosDB:有效地从大型容器迁移记录

来自分类Dev

有效地更新MySQL记录

来自分类Dev

仅包括最新/最新关联记录和活动记录?

来自分类Dev

在.NET / T-SQL中有效地选择真实记录或虚拟/默认“记录”

来自分类Dev

如何有效地更新Rails中的关联集合(渴望加载)

来自分类Dev

您如何有效地使用“脚本”命令来记录交互式外壳?

来自分类Dev

有效地获取JSONL文件的第一条记录

来自分类Dev

首先在代码中有效地更新多个记录

来自分类Dev

如何有效地显示来自HashMap的值以用于SQLite的记录?

来自分类Dev

您如何有效地使用“脚本”命令来记录交互式外壳?

来自分类Dev

哪种技术可以更有效地替换记录

来自分类Dev

如何有效地从记录列表中选择特定的行号?

来自分类Dev

Python:保存字节以有效地记录时间戳

来自分类Dev

有效地获取JSONL文件的第一条记录

来自分类Dev

SQL:有效地获取最后一条记录

来自分类Dev

如何有效地从记录子集中获取 has_many 值?

来自分类Dev

如何有效地存储聊天记录 [NodeJS, SQL]

来自分类Dev

如何有效地对从数据库读取的记录进行复杂的处理

来自分类Dev

有效地提取包括路径和行号在内的匹配行?

来自分类Dev

可以在单个查询中有效地完成“常量”查询吗?

来自分类Dev

可以在单个查询中有效地完成“常量”查询吗?

来自分类Dev

有效地从PyGithub获取最新的提交URL

来自分类Dev

有效查询连续天数记录

来自分类Dev

Clojure中的补码和有效地不同吗?

来自分类Dev

索引全文搜索查询以有效地扇出

Related 相关文章

  1. 1

    CNAME记录被通配符CNAME记录有效地忽略和覆盖

  2. 2

    如何有效地将记录存储为Ember查询参数

  3. 3

    有效地找到记录的子集以及总数

  4. 4

    哪种技术更有效地替换记录

  5. 5

    CosmosDB:有效地从大型容器迁移记录

  6. 6

    有效地更新MySQL记录

  7. 7

    仅包括最新/最新关联记录和活动记录?

  8. 8

    在.NET / T-SQL中有效地选择真实记录或虚拟/默认“记录”

  9. 9

    如何有效地更新Rails中的关联集合(渴望加载)

  10. 10

    您如何有效地使用“脚本”命令来记录交互式外壳?

  11. 11

    有效地获取JSONL文件的第一条记录

  12. 12

    首先在代码中有效地更新多个记录

  13. 13

    如何有效地显示来自HashMap的值以用于SQLite的记录?

  14. 14

    您如何有效地使用“脚本”命令来记录交互式外壳?

  15. 15

    哪种技术可以更有效地替换记录

  16. 16

    如何有效地从记录列表中选择特定的行号?

  17. 17

    Python:保存字节以有效地记录时间戳

  18. 18

    有效地获取JSONL文件的第一条记录

  19. 19

    SQL:有效地获取最后一条记录

  20. 20

    如何有效地从记录子集中获取 has_many 值?

  21. 21

    如何有效地存储聊天记录 [NodeJS, SQL]

  22. 22

    如何有效地对从数据库读取的记录进行复杂的处理

  23. 23

    有效地提取包括路径和行号在内的匹配行?

  24. 24

    可以在单个查询中有效地完成“常量”查询吗?

  25. 25

    可以在单个查询中有效地完成“常量”查询吗?

  26. 26

    有效地从PyGithub获取最新的提交URL

  27. 27

    有效查询连续天数记录

  28. 28

    Clojure中的补码和有效地不同吗?

  29. 29

    索引全文搜索查询以有效地扇出

热门标签

归档