J'ai deux modèles, Courier
et Order
.
J'ai la requête suivante ci-dessous:
active_couriers = Courier.
available_courier_status.
where(:service_region_id => @service_region.id).
includes(:orders)
Cette requête fonctionne, cependant, elle récupère toutes les commandes. Je souhaite limiter les commandes aux seules commandes de la journée. J'ai donc ajouté la requête suivante 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)
Cela me donne l'erreur:
PG::UndefinedTable: ERROR: missing FROM-clause entry for table "orders"
Qu'est-ce que je fais mal ici?
Hmm, on dirait que vous essayez d'inclure current_orders
et incluez order
. S'agit-il des mêmes tables avec des conditions différentes? Cela pourrait confondre l'enregistrement actif. De plus, je suis sûr qu'il est sage d'inclure la méthode references
lors du référencement d'une table jointe. Essayez peut-être quelque chose comme ceci:
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)
Vous pouvez aussi utiliser eager_load
pour fournir le même comportement exact que includes
+ references
. Il effectue la même jointure gauche gauche sur la table passée en argument, mais d'une manière beaucoup plus propre.
Documents ici: http://apidock.com/Rails/v4.2.7/ActiveRecord/QueryMethods/eager_load
Par cet exemple:
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)