2012-05-17 66 views
2

我有一個帶有散列元列的用戶模型,例如{「version」=>「1.0」,「country」=>「UK」}Rails:計算散列鍵值的最佳做法

什麼是最好的做法/有效的方法來計算任何關鍵的每個個人價值觀?所以,我可能會想弄清楚有多少記錄具有國家=英國或美國或法國等我不知道事先每個鍵的所有可能的值...

我想我可以在一個大循環做

User.all.each do |user| 
    user.meta["country"] .......... 

但是有沒有更好的方法來做到這一點?

+0

可以讓數據庫做的工作,如果你沒有序列化的字段成元與這些值iteract柱。我看不到如何避免循環所有記錄。 – Mischa

回答

10

是的,有group_by

arr = [{"version" => "1.0", "country" => "UK"}, 
     {"version" => "1.0", "country" => "France"}, 
     {"version" => "1.0", "country" => "UK"}, 
     {"version" => "1.0", "country" => "USA"}, 
     {"version" => "1.0", "country" => "France"}, 
     {"version" => "1.0", "country" => "UK"}] 
grouped = arr.group_by {|el| el["country"]} 
#=> {"UK"=>[{"version"=>"1.0", "country"=>"UK"}, 
#   {"version"=>"1.0", "country"=>"UK"}, 
#   {"version"=>"1.0", "country"=>"UK"}], 
# "France"=>[{"version"=>"1.0", "country"=>"France"}, 
#    {"version"=>"1.0", "country"=>"France"}], 
# "USA"=>[{"version"=>"1.0", "country"=>"USA"}]} 
grouped.map {|k,v| [k, v.length]} 
# => [["UK", 3], ["France", 2], ["USA", 1]] 
+0

這看起來很有希望,但是如何從我的模型中獲得「arr」的結構? 我試過'User.all.group_by {| meta | meta [「country」]}。map do {| k,v | [k,v.length]}'但似乎沒有工作? – minovsky

+0

嘗試'User.all.group_by {| user | user.meta [ 「國」]} ...'。請記住,'User.all'返回一個'用戶'的數組,而不是'meta'列。 – Chowlett

+0

你是對的!這是太棒了!!!非常感謝你:) 一個次要注:我得到這個無需在地圖上一步 – minovsky

0

你可以這樣做,算誰擁有薈萃所有用戶[「國家」] ==「UK」

User.all.inject{|count, u| count += 1 if u.meta['country'] == 'UK'} 
+0

這將在未來得心應手。非常感謝! – minovsky

1

如果你已經連載於SQL數據庫值,這只是這個值的工作迭代方式他們。但一些NOSQL BD的允許使用BD的工具(如蒙戈)