Ruby on rails Rails:在散列中计算键值的最佳实践

Ruby on rails Rails:在散列中计算键值的最佳实践,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个用户模型,它有一个带有散列的元列,例如{“version”=>“1.0”,“country”=>“UK”} 计算任何键中每个值的最佳实践/有效方法是什么?因此,我可能想计算出有多少记录的国家=英国、美国或法国等。我事先不知道每个键中所有可能的值 我想我可以做一个大循环 User.all.each do |user| user.meta["country"] .......... 但是有没有更好的方法呢?你可以这样做来统计所有拥有meta['country']=='UK'的用户 Us

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

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

我想我可以做一个大循环

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

但是有没有更好的方法呢?

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

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

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

是的,有
groupby

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]]

如果没有将字段序列化为元列,则可以让数据库来完成这项工作。我不知道如何避免在所有记录中循环。这看起来很有希望,但如何从我的模型中获得“arr”的结构?我试过了
User.all.group_by{| meta | meta[“country”]}。map do{k,v |[k,v.length]}
但似乎没有效果?试着
User.all.group_by{| User | User.meta[“country”}…
。记住,
User.all
返回一个
User
s的“数组”,而不是
meta
列。你是对的!!!这太棒了!!!非常感谢:)一个小提示:我在没有地图步骤中的
do
的情况下完成了这项工作。你是对的;从我的irb会议中滑入转录。现在已修复。这将在将来很方便。多谢!