I\'m trying to list the number of users by age-range:
Range : #Users
10-14 : 16
15-21 : 120
22-29 : 312
30-40 : 12131
41-70 : 612
71-120 : 20
>
I find the accepted answer to be a bit dense. Fast but hard to understand and write. Today, I came up with a slower but simpler solution. Since we are grouping ages into ranges, we can assume that we won't have values over 125
That means that if you use a ruby filter on a grouped and counted result set, you won't iterate over more than 125 items. This will be slower than a sql range based group/count, but it was fast enough for my purposes while still relying on the DB for most of the heavy lifting. Iterating over a hash with less than 125 items doesn't seem like a big deal. Especially when the key value pairs are just ints like this:
{
0 => 0,
1 => 1,
3 => 5,
25 => 3,
99 => 3
}
Here's the psudo-code:
users = User
.where(age: (min..max))
.group(:age)
.count(:age)
group = Hash.new(0)
users.each{|age, count|
case
when age <= 10
group['under 10'] += count
when age <= 25
group['11-25'] += count
when age <= 40
group['26-40'] += count
else
group['41+'] += count
end
}
Note: this solution provides the count of users in a given range.