我正在使用 groupdate 和 chartkick 来尝试显示一个图表,显示我们的用户群随时间的增长(和下降)。
使用以下它可以在柱形图中正常工作,但在折线图中会变得混乱:
sum=0
User.group_by_day(:created_at).count.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)
谁能指出我正确的方向?或者有没有更好的方法让这个工作?
我正在使用 groupdate 和 chartkick 来尝试显示一个图表,显示我们的用户群随时间的增长(和下降)。
使用以下它可以在柱形图中正常工作,但在折线图中会变得混乱:
sum=0
User.group_by_day(:created_at).count.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)
谁能指出我正确的方向?或者有没有更好的方法让这个工作?
马丁的回答很接近,但我最终使用了:
User.group_by_week(:created_at).order("week asc").count.map { |x,y| { x => (sum += y)} }.reduce({}, :merge)
要每周获得 - 注意顺序(“week asc”) - 这是修复它的原因......
这是因为您需要在进行累积和之前进行排序。
尝试这个:
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)
我用这个:
单线:
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