【发布时间】:2019-01-03 18:47:34
【问题描述】:
我已经挖掘了几天,还没有找到一个很好的解释来解释这种行为变化。 我正在将 Rails 应用程序从 3.2 升级到 5.2 这是我的 rails 3 应用程序通过测试中的代码。
ps = Project.includes(:rentals).where('rentals.id IN (?)', [1,2,3,4])
这会产生一个大的旧左连接 SQL 查询。
但是如果我在 rails 5 中执行相同的查询,我会得到一个 mysql 错误
ActiveRecord::StatementInvalid (Mysql2::Error: Unknown column 'rentals.id' in 'where clause': SELECT `projects`.* FROM `projects` WHERE (rentals.id IN (1,2,3,4)) LIMIT 11 /*application:ConHQ*/)
我对包含的理解是它应该执行单独的查询,除非在 where 子句中引用了包含的表,在这种情况下它应该执行左连接。但似乎这并没有发生在这里。在这种情况下使用 eager_load 有效:
ps = Project.eager_load(:rentals).where('rentals.id IN (?)', [1,2,3,4])
但我认为包含应该做同样的事情。
我还注意到,有时包含 does 执行与 eager_load 相同的查询
@project = Project.find(174)
@project.rentals.eager_load(:equipment_name).where('equipment_names.id IN (?)', [1,2,3,4])
@project.rentals.includes(:equipment_name).where('equipment_names.id IN (?)', [1,2,3,4])
在这种情况下,eager_load 和包括都执行左连接。我还没有找到任何文档来解释为什么包含在这些情况下的行为不同。究竟是如何选择它执行的查询?
【问题讨论】:
-
查看本指南:guides.rubyonrails.org/…
-
好资源,谢谢。我没看过这个
标签: mysql ruby-on-rails ruby-on-rails-5 rails-upgrade