2

{"version"=>"1.0", "country"=>"UK"} など、ハッシュ付きのメタ列を持つ User モデルがあります。

キーの個々の値をカウントするベストプラクティス/効率的な方法は何ですか? したがって、country = UK、USA、France などのレコードがいくつあるのかを調べたいと思うかもしれません。各キーで可能なすべての値を事前に知っているわけではありません...

私は大きなループでそれを行うことができると思います

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 に答える