一次在Rails中从多个表中获取记录?

问题描述 投票:0回答:1

当我执行以下操作时,Rails两次查询数据库:

p = Post.find(1)
c = p.comments

查询看起来像:

SELECT "posts".* from "posts" WHERE "posts"."id" = 1 LIMIT 1

SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = 1

是否有一种方法可以将它们组合成一个查询?类似于:

SELECT p.*, c.*
FROM comments c
JOIN (
  SELECT * FROM posts WHERE id = 1 LIMIT 1
) p ON p.id = c.post_id

然后让Rails将其分为两种类型的记录?

ruby-on-rails ruby rails-activerecord
1个回答
1
投票

Ruby on Rails允许eager loading associations避免过多的数据库查询-通常,这用于将常见的N + 1查询问题减少为仅两个查询。例如,以下查询甚至只进行two个查询,即使是加载所有帖子和评论,它也会在内部建立关联。

Post.includes(:comments)

但是no无法自动将查询中的查询简化为一个查询并将查询结果再次内部解构为不同的对象。

当解构部分不重要时,您可以编写

Post.select('posts.*, comments.*').joins(:comments).where(id: 1)

请注意,如果两个表中都有相同名称的列,则可能需要在select调用中重命名列。

© www.soinside.com 2019 - 2024. All rights reserved.