Rails:计算哈希中键值的最佳实践

时间:2012-05-17 11:22:55

标签: ruby-on-rails ruby ruby-on-rails-3

我的用户模型有一个带散列的元列,例如{“version”=>“1.0”,“country”=>“UK”}

在任何密钥中计算每个单独值的最佳实践/有效方法是什么?所以我可能想知道有多少记录有country = UK或USA或France等。我事先并不知道每个键中所有可能的值......

我想我可以在一个大循环中完成它

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

但有更好的方法吗?

3 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:1)

如果在sql DB中有序列化值,则只能使用此值来迭代它们。但是有几个NOSQL BD允许使用BD的工具(如mongo)迭代这些值

答案 2 :(得分:0)

您可以对所有拥有元['国家'] =='英国'

的用户进行统计
User.all.inject{|count, u| count += 1 if u.meta['country'] == 'UK'}