集团按年龄范围在红宝石用户 [英] Group Users by Age Range in ruby
问题描述
我想通过年龄范围列出用户数:
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 was thinking of creating a static array of hashes:
AGE_RANGES = [
{label:"10 - 14", min:10, max:14},
{label:"15 - 21", min:15, max:21},
{label:"22 - 29", min:22, max:29},
{label:"30 - 40", min:30, max:40},
{label:"41 - 70", min:41, max:70},
{label:"71 - 120", min:71, max:120}
]
,然后用它为我的搜索过滤器,以及为我的查询。但是,我想不出获得最大的表现出它的一种方式。
and then use it for my search filter, as well as for my query. But, I cannot think of a way of getting the most performance out of it.
我在我的模型只有群体年龄的方法:
My method in my model only groups by age:
def self.group_by_ageRange(minAge, maxAge)
query = User.group("users.age")
.where("users.age BETWEEN minAge and maxAge ")
.select("users.age,
count(*) as number_of_users")
end
有什么建议?
推荐答案
您想建立一些SQL,看起来像这样:
You want to build some SQL that looks like this:
select count(*),
case
when age between 10 and 14 then '10 - 14'
when age between 15 and 21 then '15 - 21'
-- ...
end as age_range
from users
where age between 10 and 120
group by age_range
在ActiveRecord的条件,这将是:
In ActiveRecord terms, that would be:
# First build the big ugly CASE, we can also figure out the
# overall max and min ages along the way.
min = nil
max = nil
cases = AGE_RANGES.map do |r|
min = [r[:min], min || r[:min]].min
max = [r[:max], max || r[:max]].max
"when age between #{r[:min]} and #{r[:max]} then '#{r[:min]} - #{r[:max]}'"
end
# Then away we go...
age_ranges = Users.select("count(*) as n, case #{cases.join(' ')} end as age_range")
.where(:age => min .. max)
.group('age_range')
.all
这会留下对象的数组中的 age_ranges
和这些对象将有 N
和 age_range
的方法。如果你想有一个哈希出这一点,那么:
That will leave you with an array of objects in age_ranges
and those objects will have n
and age_range
methods. If you want a Hash out of that, then:
age_ranges = Hash[age_ranges.map { |r| [r.age_range, r.n] }]
这将不包括那些没有任何人在他们的课程范围;我会离开,作为一个练习留给读者。
That won't include ranges that don't have any people in them of course; I'll leave that as an exercise for the reader.
这篇关于集团按年龄范围在红宝石用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!