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

Huy*_*Huy 47 ruby-on-rails psql ruby-on-rails-4

我有两个型号,CourierOrder.

我在下面有以下查询:

active_couriers = Courier.
  available_courier_status.
  where(:service_region_id => @service_region.id).
  includes(:orders)
Run Code Online (Sandbox Code Playgroud)

但是,此查询有效,它会提取所有订单.我想将订单限制为当天的订单.所以我添加了以下查询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)
Run Code Online (Sandbox Code Playgroud)

这给了我错误:

PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "orders"
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

Dan*_*nor 80

嗯,看起来你正试图包括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)
Run Code Online (Sandbox Code Playgroud)

  • 参考文献方法:http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-references (6认同)
  • 谢谢.我想你需要添加`references` (5认同)

mat*_*gel 11

您还可以使用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)
Run Code Online (Sandbox Code Playgroud)