Rails 4:使用arel_table.maximum.desc进行排序时出错

5

我有一个Order和一个Product模型,它们之间有多对多的关系。所以一个订单has_many产品,每个产品都有不同的价格。

现在我想按照订单中最高价格的产品对订单进行排序。

这是我的代码:

@orders = Order.group(arel_table[:id]).
                order(Product.arel_table[:price].maximum)

默认情况下,它与ASC顺序完美配合,但是当我像这样按照DESC顺序进行排序时:
@orders = Order.group(arel_table[:id]).
                order(Product.arel_table[:price].maximum.desc)

我收到了这样的错误信息:

我遇到了这个错误:

undefined method `desc' for #<Arel::Nodes::Max:0x007fb2ab9104a0>

我该如何将订单按照降序排列?


嘿,你应该检查答案并接受对你有用的那个... - davegson
非常抱歉,这是我第一次在Stack Overflow上尝试,并忘记选择答案。非常感谢您的帮助。 - Pengyu Qi
3个回答

3

1

首先,对于这个任务,普通的ActiveRecord就足够了。

我的尝试是通过连接首先选择产品的max_price

Order.select('users.id, MAX(products.price) AS max_price').group('orders.id')

+----+-----------+
| id | max_price |
+----+-----------+
| 1  |    850    |
| 2  |    240    |
| 3  |    200    |
| 4  |    100    |
| 5  |    300    |
+----+-----------+

之后,按照要求对max_price进行排序是一项简单的任务。

.order('max_price DESC')
.order('max_price ASC')

+----+-----------+
| id | max_price |
+----+-----------+
| 4  |    100    |
| 3  |    200    |
| 2  |    240    |
| 5  |    300    |
| 1  |    850    |
+----+-----------+

我相信这会让你有所启发 ;). 当然,可以自由选择不仅限于id

纯 SQL 可以正常工作,但我想尝试使用 are_table 来编写更多类似 Rails 的代码。 - Pengyu Qi
使用 Arel 绝对不是 Rails 的正确方式 - 这就是为什么 ActiveRecord 被构建的原因。 - davegson

0

试试这个:

@orders = Order.group(arel_table[:id]).
            order(Product.arel_table[:price].maximum: :desc)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接