我有两个模型,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"
我在这里做错了什么?
答案 0 :(得分:77)
嗯,您似乎想要加入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)
答案 1 :(得分:10)
您还可以使用eager_load
提供与includes
+ references
相同的确切行为。它在作为参数传递的表上执行相同的Left Outer Join,但是更加清晰。
文档: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)
答案 2 :(得分:-1)
在使用.includes(:service_region)
进行过滤之前,请确保提供where
。