我有两个问题。第一个返回一个包含三个项目的关联:
Order.where(aggregation_key: params[:aggregation_key])
第二个返回一个空关联:
Order.joins(:tips, :line_items).where(aggregation_key: params[:aggregation_key])
唯一的区别是第二个连接两个表。是什么导致结果为空关联?
更新:
经过进一步的实验,我发现如果从连接子句中删除:tips
,则返回完全关联。不幸的是,我需要在声明中加入后续条款的提示。如果有人知道为什么会这样,我会非常感激。
答案 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])