这更多的是一个“为什么事情会这样运作”的问题,而不是一个“我不知道该怎么做”的问题......
因此,提取您知道将要使用的关联记录的福音是使用: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)
It is走捷径,因为它会立即提取所有注释,但它仍然不是联接(这就是所有文档似乎所说的)。我获得加入的唯一方法是使用:joins
代替:include
:
Post.all(:joins => :comments)
日志显示:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
我错过了什么吗?我有一个包含六个关联的应用程序,我在一个屏幕上显示所有关联的数据。似乎使用 1 个连接查询比 6 个个体更好。我知道从性能角度来看,进行联接并不总是比单独查询更好(事实上,如果您按照花费的时间计算,看起来上面的两个单独查询比联接更快),但毕竟文档我一直在读我很惊讶地看到:include
不按广告宣传的那样工作。
也许是铁轨is认识到性能问题并且除某些情况外不加入?