ruby-on-rails - Rails :include vs.:加入

标签 ruby-on-rails ruby database join rails-activerecord

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

因此,拉取您知道将要使用的关联记录的福音是使用 :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 意识到了性能问题并且除了在某些情况下不会加入?

最佳答案

看来 :include 功能在 Rails 2.1 中发生了变化。 Rails 曾经在所有情况下都执行连接,但出于性能原因,它已更改为在某些情况下使用多个查询。 This blog post Fabio Akita 提供了一些关于更改的有用信息(请参阅标题为“优化的预先加载”的部分)。

关于ruby-on-rails - Rails :include vs.:加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208636/

相关文章:

ruby-on-rails - 找不到没有 ID 的 <Model> - rails 5

javascript - 将实时更新传递给 Stripe Checkout 金额

database - 如何在 visual studio (express) 中生成数据库模式图?

sql - 如何在运行总计达到零的帐户上应用状态

ruby - 您如何为该语言编写编译器?

MYSQL|将值插入 SET 数据类型

mysql - 如何在 Rails 5 迁移中为 MySQL 创建一个 UNSIGNED INT?

mysql - 尝试了很多建议,如何安装 mysql2 gem?

ruby - 在 Ruby 中持久化哈希

ruby-on-rails - gem install pg 在 OSX 10.9 上失败