在 ruby​​ 中按年龄范围对用户进行分组 [英] Group Users by Age Range in ruby

查看:23
本文介绍了在 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 中留下一组对象,这些对象将具有 nage_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.

这篇关于在 ruby​​ 中按年龄范围对用户进行分组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆