PG:: UndefinedTable: ошибка: отсутствует запись из-предложения для таблицы при использовании соединений и где

у меня есть две модели, 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"

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

2 ответов


Хм, похоже, вы пытаетесь включить current_orders и включения order. Одни и те же таблицы с разными условиями? Это может быть путать active record. Кроме того, я уверен, что разумно включить 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)

вы также можете использовать 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)