使用连接时,ActiveRecord返回空关联

时间:2015-07-07 17:22:49

标签: ruby-on-rails postgresql activerecord

我有两个问题。第一个返回一个包含三个项目的关联:

Order.where(aggregation_key: params[:aggregation_key])

第二个返回一个空关联:

Order.joins(:tips, :line_items).where(aggregation_key: params[:aggregation_key])

唯一的区别是第二个连接两个表。是什么导致结果为空关联?

更新:

经过进一步的实验,我发现如果从连接子句中删除:tips,则返回完全关联。不幸的是,我需要在声明中加入后续条款的提示。如果有人知道为什么会这样,我会非常感激。

1 个答案:

答案 0 :(得分:1)

ActiveRecord正在进行INNER JOIN,因此如果它发现的订单中没有提示和line_items中的相关记录,您将获得空关联。

LEFT OUTER JOIN

Order.joins("LEFT OUTER JOIN tips ON tips.order_id = orders.id").where(aggregation_key: params[:aggregation_key])

您可以使用ActiveRecord的include方法:

Order.includes(:tips, :line_items).where(aggregation_key: params[:aggregation_key])

更新:

或者你可以这样做:

LEFT JOIN

Order.joins("LEFT JOIN tips ON tips.order_id = order.id 
             LEFT JOIN line_items ON line_items.order_id = orders.id")
     .where(aggregation_key: params[:aggregation_key])