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查询并不是一种简单或直接的方法,因为那些人希望从特定模型的表中进行选择.
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |