Я копал пару дней и не нашел хорошего объяснения этому изменению поведения.Я нахожусь в процессе обновления приложения Rails с 3.2 до 5.2, это код в проходящем тесте из моего приложения rails 3.
ps = Project.includes(:rentals).where('rentals.id IN (?)', [1,2,3,4])
это выплевывает большой старый SQL-запрос на левые соединения.
но если я делаю тот же запрос в рельсах 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])
, но я подумал, что включает в себя то же самое.
Я также заметил, что иногда включает в себя выполняет тот же запрос, что и 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 и включает оба выполняют левое соединение.Я не нашел никакой документации, которая объясняет, почему в таких ситуациях действует по-разному.как именно включает в себя выбрать запрос, который он выполняет?