绑定的activerecords-queries使用带有限制的聚合函数(sum,avg,...)

dam*_*ser 4 model aggregate-functions ruby-on-rails-3

鉴于此伪查询:

Model.sum(:column, :condition => ['id = ?', id], order => "date DESC", :limit => X)
Run Code Online (Sandbox Code Playgroud)

在这里,我们遇到的问题是,获得的总和不受值X的限制(它取总和列上的所有值而不是X(第一)条目的总和).

似乎limit是在计算聚合函数之后进行的sum.

我怎样才能得到仅由第一次X条目限制的金额?

MrT*_*rus 10

MurifoX的建议不起作用,因为LIMIT仅适用于最终结果集,该结果集只有一行(总和).看到这个帖子.

解决这个问题的最简单方法是不在数据库中进行计数:

Model.where(:id => id).order('date DESC').limit(3).pluck(:column).compact.sum
Run Code Online (Sandbox Code Playgroud)

这会将值加载column到Ruby中并将其相加.现在,如果记录集非常庞大,那么效率会明显降低,因为所有这些值都会被加载到应用程序的内存中.

编辑:添加.compact- 这将在对数组进行求和之前从数组中删除nils(这会导致错误).

在SQL中执行此操作的建议方法是使用子查询,如下所示:

SELECT SUM(subquery.column) FROM (
  SELECT * FROM models WHERE id = 5 LIMIT 3
) AS subquery;
Run Code Online (Sandbox Code Playgroud)

将其转换为ActiveRecord查询并不是一种简单或直接的方法,因为那些人​​希望从特定模型的表中进行选择.