9

我正在使用 groupdate 和 chartkick 来尝试显示一个图表,显示我们的用户群随时间的增长(和下降)。

使用以下它可以在柱形图中正常工作,但在折线图中会变得混乱:

sum=0
User.group_by_day(:created_at).count.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)

谁能指出我正确的方向?或者有没有更好的方法让这个工作?

4

3 回答 3

11

马丁的回答很接近,但我最终使用了:

User.group_by_week(:created_at).order("week asc").count.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)

要每周获得 - 注意顺序(“week asc”) - 这是修复它的原因......

于 2013-06-06T10:50:19.503 回答
11

这是因为您需要在进行累积和之前进行排序。

尝试这个:

sum=0
User.group_by_day(:created_at).count.to_a.sort{|x,y| x[0] <=> y[0]}.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)
于 2013-06-03T20:46:27.437 回答
0

我用这个:

单线:

User.group_by_day(:created_at).count.each_with_object({}) { |acc, (key, value)| acc[key] = ((acc.values.last || 0) + value); acc }

用 prettier 的 ruby​​ 插件美化:

User
  .group_by_day(:created_at)
  .count
  .each_with_object({}) do |acc, (key, value)|
    acc[key] = ((acc.values.last || 0) + value)
  end
于 2021-01-19T23:05:37.310 回答