【发布时间】:2010-11-15 13:40:51
【问题描述】:
这更像是一个“为什么事情会这样运作”的问题,而不是一个“我不知道该怎么做”的问题......
因此,提取您知道将要使用的关联记录的福音是使用: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)
它 走捷径,因为它一次拉出所有 cmets,但它仍然不是连接(所有文档似乎都这么说)。我可以加入的唯一方法是使用: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 意识到了性能问题,除非在某些情况下才加入?
【问题讨论】:
-
如果您使用的是旧版本的 Rails,请通过标签或在您的问题正文中说明。否则,如果您现在使用的是 Rails 4,则为
includes(适用于阅读本文的任何人) -
这篇 Scout 工程博客文章是一个很好的参考:scoutapm.com/blog/…
-
现在还有
:preload和:eager_load:bigbinary.com/blog/preload-vs-eager-load-vs-joins-vs-includes
标签: ruby-on-rails ruby database join rails-activerecord