在 Rails 中一次从多个表中获取记录?
Fetch records from multiple tables at once in Rails?
当我执行如下操作时,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 允许 eager loading associations 避免过多的数据库查询——通常,这用于将常见的 N+1 查询问题减少到只有两个查询。例如,以下查询将仅进行 两次 查询,甚至加载所有帖子和评论,并在内部构建关联。
Post.includes(:comments)
但是没有没有办法自动将您问题中的查询减少为仅一个查询并解构查询再次在内部产生不同的对象。
当解构部分不重要的时候可以这样写
Post.select('posts.*, comments.*').joins(:comments).where(id: 1)
请注意,如果两个表中的列名称相同,您可能需要在 select
调用中重命名列。
当我执行如下操作时,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 允许 eager loading associations 避免过多的数据库查询——通常,这用于将常见的 N+1 查询问题减少到只有两个查询。例如,以下查询将仅进行 两次 查询,甚至加载所有帖子和评论,并在内部构建关联。
Post.includes(:comments)
但是没有没有办法自动将您问题中的查询减少为仅一个查询并解构查询再次在内部产生不同的对象。
当解构部分不重要的时候可以这样写
Post.select('posts.*, comments.*').joins(:comments).where(id: 1)
请注意,如果两个表中的列名称相同,您可能需要在 select
调用中重命名列。