最佳答案
这更像是一个“事情为什么会这样”的问题,而不是一个“我不知道怎么做”的问题。
因此,关于提取关联记录的福音,你知道你将使用:include
,因为你将获得一个连接,并避免一大堆额外的查询:
Post.all(:include => :comments)
然而,当你查看日志时,没有连接发生:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
它是采用了一个快捷方式,因为它一次拉出了所有的注释,但它仍然不是一个连接(这是所有文档似乎都说的)。我能获得连接的唯一方法是使用:joins
而不是:include
:
Post.all(:joins => :comments)
日志显示:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
我遗漏了什么吗?我有一个带有六个关联的应用程序,在一个屏幕上显示所有关联的数据。看起来使用一个联合查询比使用6个独立查询更好。我知道在性能方面,它并不总是更好地做一个连接而不是单独的查询(事实上,如果你花的时间,看起来上面的两个单独的查询比连接更快),但在我一直在阅读所有的文档之后,我很惊讶地看到:include
不像宣传的那样工作。
也许Rails 是认识到性能问题,除非在某些情况下不加入?