首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails ActiveRecord "maximum(:column)“忽略顺序

Rails ActiveRecord "maximum(:column)“忽略顺序
EN

Stack Overflow用户
提问于 2014-04-23 12:10:13
回答 4查看 514关注 0票数 3

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

我的问题是:

代码语言:javascript
复制
max_value = current_user.books.order('created_at DESC').limit(365).maximum(:price)

然而,产生的查询是:

代码语言:javascript
复制
(243.0ms)  SELECT MAX(`books`.`price`) AS max_id FROM `books` WHERE `books`.`user_id` = 2 LIMIT 365

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-04-23 12:27:48

active record代码(active_record/Relations.rb)中有一行奇怪的代码,用于删除排序。我之所以说好奇,是因为它专门指的是postgres:

代码语言:javascript
复制
# Postgresql doesn't like ORDER BY when there are no GROUP BY
relation = reorder(nil)

您应该能够使用pluck来实现您想要的结果。它可以选择一个可以引用聚合函数的属性:

代码语言:javascript
复制
q = current_user.books.order('created_at DESC').limit(365)
max_value = q.pluck("max(price)").first

pluck将返回一个值数组,因此需要第一个值才能获得第一个值(在本例中只有一个)。如果没有结果,那么它将返回零。

票数 2
EN

Stack Overflow用户

发布于 2014-04-23 12:46:45

最好也是最有效的方法是做子查询。做这样的事。

代码语言:javascript
复制
       current_user.books.where(id: current_user.books.order('created_at DESC').limit(365)).maximum(:price)
票数 0
EN

Stack Overflow用户

发布于 2014-04-23 13:12:05

根据导轨maximum返回该字段的表的最大值,因此我假设Active Records试图优化查询,最终导致执行链式方法的顺序混乱。

您是否可以尝试:首先查询所需的365行,然后得到最大值?

代码语言:javascript
复制
max_value = (current_user.books.order('created_at DESC').limit(365)).maximum(:price)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23243828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档