按组和子组计数

时间:2016-02-26 11:57:32

标签: ruby-on-rails activerecord

我想生成一些关于我在模型中的一些数据的统计数据

我想根据关联和状态列创建统计信息。

Model.group(:association_id).group(:status).count

得到像

这样的结果
[{ association_id1 => { status1 => X1, status2 => y1 } },
 { association_id2 => { status1 => x2, status2 => y2 } }...etc

不管它是作为一个数组还是哈希出来都不是很麻烦,只需要数字一致地出来。 是否有“轨道”方式来做这个或一个方便的宝石?

2 个答案:

答案 0 :(得分:1)

确定。做了一些更好的事情,虽然乐意接受如何清理它的建议。

group_counts = Model.group(["association_id","status"]).count

返回类似于:

的内容
=> {[nil, "status1"]=>2,
[ass_id1, "status1"]=>58,
[ass_id2, "status7"]=>1,
[ass_id2, "status3"]=>71 ...etc

虽然它包含数据,但它是一个可以使用的猪。

stats = group_counts.group_by{|k,v| k[0]}.map{|k,v| {k => v.map{|x| {x[0][1] => x[1] }}.inject(:merge) }}

给我一​​些友善的东西

=> [{
 nil => {
  "status1" => 10,
  "status2" => 23},
 "ass_id1" => {
  "status1" => 7,
  "status2" => 23
}...etc]

希望能帮助某人。

答案 1 :(得分:0)

这非常难看,效率低下,必须有更好的方法来做到这一点,但是......

Model.pluck(:association_id).uniq.map{ |ass| { 
  name:(ass.blank? ? nil : Association.find(ass).name), data: 
    Model.where(association_id:ass).group(:status).count 
} }

给出我需要的东西。 显然,如果你不需要名字,第一学期会更简单一些。

即。

 Model.pluck(:association_id).uniq.map{ |ass| { 
   id:ass, data:Model.where(association_id:ass).group(:status).count 
 } }