当我执行以下操作时,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查询问题减少为仅两个查询。例如,以下查询甚至只进行two个查询,即使是加载所有帖子和评论,它也会在内部建立关联。
Post.includes(:comments)
但是no无法自动将查询中的查询简化为一个查询并将查询结果再次内部解构为不同的对象。
当解构部分不重要时,您可以编写
Post.select('posts.*, comments.*').joins(:comments).where(id: 1)
请注意,如果两个表中都有相同名称的列,则可能需要在select
调用中重命名列。