2

我有一个用户模型,它有一个带有哈希的元列,例如 {"version"=>"1.0", "country"=>"UK"}

计算任何键中每个值的最佳实践/有效方法是什么?所以我可能想弄清楚有多少记录有国家=英国或美国或法国等。我事先不知道每个键中的所有可能值......

我想我可以在一个大循环中做到这一点

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

但是有更好的方法吗?

4

3 回答 3

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]]
于 2012-05-17T11:36:01.100 回答
1

如果您在 sql DB 中有序列化值,那么使用这些值来迭代它们是唯一的方法。但是一些 NOSQL BD 允许使用 BD 的工具(如 mongo)迭代这些值

于 2012-05-17T11:29:01.323 回答
0

您可以这样做来计算所有拥有 meta['country'] == 'UK' 的用户

User.all.inject{|count, u| count += 1 if u.meta['country'] == 'UK'}
于 2012-05-17T11:27:50.403 回答