2014-10-29 95 views
1

我正在使用MongoDB来存储聚合信息。一些类似于以下的哈希,我们可以看到有多少客户有按性别,年龄和区域(实际数据结构具有5级)对它们进行分组:嵌套哈希上的元素总和

customers = { 
    male: { 
    young: { 
     european: 1, 
     american: 2, 
    }, 
    adult: { 
     european: 3, 
     american: 4, 
    }, 
    senior: { 
     european: 5, 
     american: 6, 
    } 
    }, 
    female: { 
    young: { 
     european: 7, 
     american: 8, 
    }, 
    adult: { 
     european: 9, 
     american: 10, 
    }, 
    senior: { 
     european: 11, 
     american: 12 
    } 
    } 
} 

业务帅哥喜欢访问的每一位的信息。考虑到这一点,我试图编写一个方法来接收像这样的散列,一个嵌套级别的数组以及他们想要查询的嵌套属性,以返回那种类型的客户。

举例:如果我们想找回年轻顾客的数量,样板应该是这样的:

levels = %i(gender age region) 
young_custumers = sum_method(customers, levels, {age: :young}) 

这应返回的年轻顾客的数量:18

任何人都知道一个优雅这样做的方式?

回答

1

以下是您可能希望考虑的方法。

代码

def sum_em(h, filter) 
    f = filter.first 
    f = h.keys if f == :all 
    if h[f.first].is_a? Hash 
    f.reduce(0) { |t,k| t+sum_em(h[k], filter.drop(1)) } 
    else 
    f.reduce(0) { |t,k| t+h[k] } 
    end 
end 

例子

这些例子对你的哈希customers

sum_em customers, [:all,  [:young],   :all]  #=> 18 
sum_em customers, [[:male], [:young],   :all]  #=> 3 
sum_em customers, [[:female], [:young],   :all]  #=> 15 
sum_em customers, [:all,  [:young, :adult], [:american]] #=> 24 
sum_em customers, [:all,  :all,    [:american]] #=> 42 
sum_em customers, [:all,  :all,    :all]  #=> 78 

这当然适用于任何级别。

+0

很不错的做法 – dcarneiro 2014-10-30 11:25:49