Mysql Rails ActiveRecord“;最大值(:列)";无视秩序

Mysql Rails ActiveRecord“;最大值(:列)";无视秩序,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我试图使用ActiveRecord检索列的最大值,但在我对值进行排序和限制之后 我的问题是: max_value = current_user.books.order('created_at DESC').limit(365).maximum(:price) (243.0ms) SELECT MAX(`books`.`price`) AS max_id FROM `books` WHERE `books`.`user_id` = 2 LIMIT 365 然而,由此产生的查询是: max_v

我试图使用ActiveRecord检索列的最大值,但在我对值进行排序和限制之后

我的问题是:

max_value = current_user.books.order('created_at DESC').limit(365).maximum(:price)
(243.0ms)  SELECT MAX(`books`.`price`) AS max_id FROM `books` WHERE `books`.`user_id` = 2 LIMIT 365
然而,由此产生的查询是:

max_value = current_user.books.order('created_at DESC').limit(365).maximum(:price)
(243.0ms)  SELECT MAX(`books`.`price`) AS max_id FROM `books` WHERE `books`.`user_id` = 2 LIMIT 365

订单被完全忽略,因此最大值来自前365条记录,而不是最后365条记录。

活动记录代码(active_record/relation/calculations.rb)中有一行奇怪的代码删除了订单。我之所以说好奇,是因为它特别指博士后:

# Postgresql doesn't like ORDER BY when there are no GROUP BY
relation = reorder(nil)
你应该能够使用它来实现你想要的。它可以选择单个属性,该属性可以作为聚合函数的引用:

q = current_user.books.order('created_at DESC').limit(365)
max_value = q.pluck("max(price)").first

pulk
将返回一个值数组,因此您需要第一个值来获取第一个值(在本例中,只有一个值)。如果没有结果,那么它将返回nil。

最好且最有效的方法是执行子查询。。像这样做

       current_user.books.where(id: current_user.books.order('created_at DESC').limit(365)).maximum(:price)
根据
maximum
返回表中该字段的最大值,因此我假设活动记录试图优化查询,结果弄乱了链式方法的执行顺序

请尝试:首先查询所需的365行,然后获取最大值

max_value = (current_user.books.order('created_at DESC').limit(365)).maximum(:price)

由于freenode上的#RubyOnRails,我找到了解决方案:

max\u value=current\u user.books.order('created\u at DESC')。limit(365)。pull(:price)。max


当然,缺点是这将获取所有365个价格,并在本地计算最大值。但我会活下来。

我找到了解决方案,这要感谢freenode上的RubyOnRails:
max\u value=current\u user.books.order('created\u at DESC')。limit(365)。pull(:price)。max
谢谢。我相信这也会奏效。我们使用连接找到了类似的解决方案,但我发现连接同一个表有点不方便。你的建议更干净。顺便问一下,你是想说
Book.order