轨道:包含vs:连接

这更多的是一个“为什么事情会这样”的问题,而不是一个“我不知道怎么做”的问题

因此,拉取您知道将要使用的关联记录的福音是使用:include,因为您将获得一个连接并避免一大堆额外的查询:

Post.all(:include=>:注释)

但是,当您查看日志时,没有发生连接:

后加载(3.7ms)从“后加载”中选择*
评论加载(0.2ms)从“评论”中选择“评论。*”
其中(“评论”。在(1,2,3,4)中发布id)
由asc创建的订单(U)

它采用了一种快捷方式,因为它一次提取所有注释,但它仍然不是一个连接(所有文档似乎都这么说)。获取联接的唯一方法是使用:联接,而不是:包含

Post.all(:joins=>:comments)

日志显示:

加载后(6.0ms)从“posts”中选择“posts”。*
内部连接“posts.id=”comments.post\u id上的“comments”

我错过什么了吗?我有一个应用程序,有六个关联,在一个屏幕上显示所有关联的数据。似乎最好使用一个联接查询,而不是6个个体。我知道,从性能角度来看,执行联接并不总是比执行单个查询更好(事实上,如果按所用时间计算,上面两个单独的查询似乎比联接更快),但在阅读了所有文档之后,我惊讶地发现:include没有像广告中那样工作

也许Rails意识到了性能问题,除非在某些情况下,否则不会加入

似乎Rails 2.1更改了:include功能。Rails过去在所有情况下都进行连接,但出于性能原因,它在某些情况下被更改为使用多个查询。Fabio Akita的这篇博文提供了一些关于这一变化的好信息(请参阅标题为“优化加载”的部分)

发表评论