Courier
とOrder
の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"
_
ここで間違って何をしていますか?
うーん、あなたは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)
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)