返回联接查询中的不同记录 - Rails 4

时间:2016-01-31 17:23:26

标签: mysql ruby-on-rails select join activerecord

我正在尝试获取并显示包含当前状态的订单列表。

@orders = Order.joins(order_status_details: :order_status)
               .order('id DESC, order_status_details.created_at DESC')
               .select("orders.id, order_status_details.status_id, order_statuses.name, order_status_details.created_at")

它工作正常,但返回所有行的订单ID重复,如下所示:

+----+-----------+----------------------+---------------------+
| id | status_id | name                 | created_at          |
+----+-----------+----------------------+---------------------+
|  8 |         1 | Pending              | 2016-01-31 16:33:30 |
|  7 |         3 | Shipped              | 2016-02-01 05:01:21 |
|  7 |         2 | Pending for shipping | 2016-01-31 05:01:21 |
|  7 |         1 | Pending              | 2016-01-31 04:01:21 |
+----+-----------+----------------------+---------------------+

正确的答案必须返回唯一的ID,因为上面的示例应该是第一行和第二行。

我已经尝试使用distinct on select.distinct.uniq.group,但我收到了错误。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,我相信你的模型是" Order有很多OrderStatusDetail"。这就是为什么你的结果中有几个不同的name的原因。

因此您可以像这样修改查询:

    @orders = Order.joins(order_status_details: :order_status)
                   .order('id DESC, order_status_details.created_at DESC')
                   .where('order_status_details.id IN (SELECT MAX(id) FROM order_status_details GROUP BY order_id)')
                   .select("orders.id, order_status_details.status_id, order_statuses.name, order_status_details.created_at")

理想情况下,where条件仅用于选择order_status_details的预期ID,例如,我使用min_id,您可以根据需要进行修改