web-dev-qa-db-ja.com

PG :: UndefinedTable:エラー:結合を使用するときにテーブルのFROM句エントリがありません

CourierOrderの2つのモデルがあります。

以下のクエリがあります:

_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"
_

ここで間違って何をしていますか?

44
Huy

うーん、あなたは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)
78
Dane O'Connor

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)
10
mattcongel