PG :: UndefinedTable:错误:使用连接时缺少表的FROM子句条目和where

时间:2014-08-02 21:41:37

标签: ruby-on-rails ruby-on-rails-4 psql

我有两个模型,CourierOrder

我在下面有以下查询:

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"

我在这里做错了什么?

3 个答案:

答案 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