返回在Rails中分组的数据量

时间:2016-10-12 14:25:09

标签: ruby-on-rails ruby

我有以下Ruby代码,它将JSON数据分组为几个月:

  data = data.group_by { |d| d['Date'].to_date.strftime('%Y-%m') }
             .collect { |k, v| {Date: k, Total: v.sum { |d| d['Total'].to_i }} }

例如,它会改变:

{"Date":"2012-04-01 12:00:00","Total":"50"},
{"Date":"2012-04-01 13:00:00","Total":"50"},
{"Date":"2012-04-02 05:00:00","Total":"100"},
{"Date":"2012-04-02 06:00:00","Total":"100"}

分为:

{"Date":"2012-04","Total":"300"}

但我想知道有多少天被归入新的JSON。

再次在上面的例子中,我想要回复:

{"Date":"2012-04","Total":"300","Days":"2"}

编辑:我不小心以为我想要最初分组的总项目,但是我编辑了这个问题,正如我真正想知道的那样,是按月分组的总天数(因为有些月份可能没有数据)所有的日子所以我想知道这个月有多完整。)

数据总是按小时计算!所以不用担心几分钟或几秒钟。

1 个答案:

答案 0 :(得分:1)

知道group_by返回一个散列,其中键被评估来自块的结果,值是枚举中对应于键的元素数组,然后你的收到了| k,v |其中k是月份,v是该月份的项目数组。

您可以使用它来改变您的代码:

data = data.group_by { |d| d['Date'].to_date.strftime('%Y-%m') }
           .collect { |k, v| {Date: k, Total: v.sum { |d| d['Total'].to_i }, Grouped: v.count} }

更新回答

好的,根据您的评论,这是我更新的答案。这段代码有效,但它不是最优雅的。可能有更好的方法来实现这一目标。但我希望无论如何这都可以帮到你。

totals = {}
data2 = data.group_by { |d|
  day = d['Date'].to_date.strftime('%Y-%m-%d')
  totals[day] ||= 0
  totals[day] += 1
  d['Date'].to_date.strftime('%Y-%m')
}.collect { |month, values|
  {
    Date: month,
    Total: values.sum { |d| d['Total'].to_i},
    Grouped: totals.group_by{|day, v| day.to_date.strftime('%Y-%m')}[month].count
   }
}

这会在单独的哈希totals中跟踪每一天,然后计算特定月份的天数。

稍微优雅

days = []
data2 = data.group_by { |d|
  day = d['Date'].to_date.strftime('%Y-%m-%d')
  days << day
  d['Date'].to_date.strftime('%Y-%m')
}.collect { |month, values|
  {
    Date: month,
    Total: values.sum { |d| d['Total'].to_i},
    Days: days.uniq.select{|day| day.to_date.strftime('%Y-%m') == month}.count
   }
}