PG:: UndefinedTable: ERROR: missing FROM-clause entry for table when using joins and where

Mam dwa modele, Courier i Order.

Poniżej mam następujące zapytanie:

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

To zapytanie działa, jednak ściąga wszystkie rozkazy. Chcę ograniczyć zamówienia tylko do zamówień na dany dzień. Dodałem więc następujące zapytanie 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)

To daj mi błąd:

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

Co ja tu robię?

Author: Ruy Diaz, 2014-08-03

2 answers

Hmm wygląda na to, że próbujesz włączyć current_orders i włączyć order. Czy są to te same tabele z różnymi warunkami? To może być mylące active record. Jestem również całkiem pewien, że mądre jest włączenie metody references podczas odwoływania się do połączonej tabeli. Może spróbuj czegoś takiego:

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)
 67
Author: Dane O'Connor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-06 08:34:55

Możesz również użyć eager_load, aby zapewnić takie samo zachowanie, jak includes + references tak. Wykonuje to samo Left Outer Join na stole przekazanym jako argument, ale w znacznie czystszy sposób.

Dokumenty tutaj: http://apidock.com/rails/v4.2.7/ActiveRecord/QueryMethods/eager_load

Na ten przykład:

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)
 6
Author: mattcongel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 19:48:02