Подтвердить что ты не робот

PG:: UndefinedTable: ERROR: отсутствует запись FROM-clause для таблицы при использовании объединений и где

У меня две модели: Courier и Order.

У меня следующий запрос ниже:

active_couriers = Courier.
  available_courier_status.
  where(:service_region_id => @service_region.id).
  includes(:orders)

Этот запрос работает, однако, он тянет во всех заказах. Я хочу ограничить заказы только заказами на день. Поэтому я добавил следующий запрос where("orders.created_at >= ?", Time.zone.now.beginning_of_day).

active_couriers = Courier.
  available_courier_status.
  where(:service_region_id => @service_region.id).
  includes(:current_orders).
  includes(:orders).
  where("orders.created_at >= ?", Time.zone.now.beginning_of_day)

Это даст мне ошибку:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "orders"

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Хм, похоже, вы пытаетесь включить current_orders и включить order. Это те же таблицы с разными условиями? Это может привести к запутыванию активной записи. Кроме того, я уверен, что разумно включать метод references при ссылке на объединенную таблицу. Возможно, попробуйте что-то вроде этого:

active_couriers = Courier.includes(:orders)
  .available_courier_status
  .where(:service_region_id => @service_region.id)
  .where("orders.created_at >= ?", Time.zone.now.beginning_of_day)
  .references(:orders)

Ответ 2

Вы также можете использовать eager_load для обеспечения того же точного поведения, что и includes + references. Он выполняет то же самое левое внешнее соединение в таблице, которое передается в качестве аргумента, но гораздо более чистым образом.

Документы здесь: http://apidock.com/rails/v4.2.7/ActiveRecord/QueryMethods/eager_load

В этом примере:

active_couriers = Courier.eager_load(:orders)
  .available_courier_status
  .where(:service_region_id => @service_region.id)
  .where("orders.created_at >= ?", Time.zone.now.beginning_of_day)