我试图使用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顺序被完全忽略,因此最大值来自前365条记录,而不是最后365条记录。
发布于 2014-04-23 12:27:48
active record代码(active_record/Relations.rb)中有一行奇怪的代码,用于删除排序。我之所以说好奇,是因为它专门指的是postgres:
# Postgresql doesn't like ORDER BY when there are no GROUP BY
relation = reorder(nil)您应该能够使用pluck来实现您想要的结果。它可以选择一个可以引用聚合函数的属性:
q = current_user.books.order('created_at DESC').limit(365)
max_value = q.pluck("max(price)").firstpluck将返回一个值数组,因此需要第一个值才能获得第一个值(在本例中只有一个)。如果没有结果,那么它将返回零。
发布于 2014-04-23 12:46:45
最好也是最有效的方法是做子查询。做这样的事。
current_user.books.where(id: current_user.books.order('created_at DESC').limit(365)).maximum(:price)发布于 2014-04-23 13:12:05
根据导轨,maximum返回该字段的表的最大值,因此我假设Active Records试图优化查询,最终导致执行链式方法的顺序混乱。
您是否可以尝试:首先查询所需的365行,然后得到最大值?
max_value = (current_user.books.order('created_at DESC').limit(365)).maximum(:price)https://stackoverflow.com/questions/23243828
复制相似问题