ActiveRecord :: StatementInvalid: Mysql2 :: Ошибка: неизвестный столбец для запроса `where` при использовании включает - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть следующие ассоциации:

mobile_application.rb

has_many :events

event.rb

belongs_to :mobile_application

Следующее работает правильно:

MobileApplication.includes(:events)
#=> MobileApplication Load (1.6ms)  SELECT `mobile_applications`.* FROM `mobile_applications`  ORDER BY created_at desc
#   Event Load (1.3ms)  SELECT `events`.* FROM `events` WHERE `events`.`mobile_application_id` IN (746, 745, 744, ....

но когда я попробовал следующее,

MobileApplication.includes(:events).where("events.expiry_date >= ?", Time.zone.now)

выдает ошибку:

MobileApplication Load (1.2ms)  SELECT `mobile_applications`.* FROM `mobile_applications` WHERE (events.expiry_date >= '2019-02-18 07:34:40.738517')  ORDER BY created_at desc
Mysql2::Error: Unknown column 'events.expiry_date' in 'where clause': SELECT `mobile_applications`.* FROM `mobile_applications` WHERE (events.expiry_date >= '2019-02-18 07:34:40.738517')  ORDER BY created_at desc
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'events.expiry_date' in 'where clause': SELECT `mobile_applications`.* FROM `mobile_applications` WHERE (events.expiry_date >= '2019-02-18 07:34:40.738517')  ORDER BY created_at desc

Обновление

Пожалуйста, предложите какЯ могу отфильтровать это.Использование references также приводит к следующей ошибке и также получено с ответом, предоставленным Мареком Липкой,

ActiveRecord::StatementInvalid: Mysql2::Error: Column 'created_at' in 
order clause is ambiguous: SELECT `mobile_applications`.`id` AS t0_r0, 
`mobile_applications`.`name` AS t0_r1, ...

Я думаю, это связано с неоднозначностью столбца, созданной default_scope, присутствующей в модели, чтобы упорядочить ее по created_at, который присутствует в обеих связанных таблицах.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Из рельсов 4.x необходимо добавить ключевое слово references:

MobileApplication.includes(:events).references(:events).where("events.expiry_date >= ?", Time.zone.now)
0 голосов
/ 18 февраля 2019

По умолчанию includes не выполняет left join, вместо этого он выполняет два отдельных запроса к БД.Вы можете принудительно left join использовать eager_load, например:

MobileApplication.eager_load(:events).where('events.expiry_date >= ?', Time.zone.now)

или, если вам на самом деле не нужна энергичная загрузка (я этого не знаю), вы можете просто использовать joins:

MobileApplication.joins(:events).where('events.expiry_date >= ?', Time.zone.now)

Об ошибке с использованием references или eager_load: Вы явно пытаетесь сделать заказ где-то created_at (хотя вы не включили это в вопрос), как:

order('created_at DESC')

Так что, очевидно, DB не знает, какую таблицу вы имеете в виду с joins, потому что в mobile_applications или events есть столбец created_at.Поэтому вам нужно указать таблицу «target», например:

order('mobile_applications.created_at DESC')
...