私はこのハッシュの配列を持っています:
- :name: Ben
:age: 18
- :name: David
:age: 19
- :name: Sam
:age: 18
それらをage
でグループ化する必要があるため、最終的には次のようになります。
18:
- :name: Ben
:age: 18
- :name: Sam
:age: 18
19:
- :name: David
:age: 19
私はそれをこのようにしてみました:
array = array.group_by &:age
しかし、私はこのエラーを受け取ります:
NoMethodError (undefined method `age' for {:name=>"Ben", :age=>18}:Hash):
私は何を間違えていますか?私はRails 3.0.1およびRuby 1.9.2
&:age
は、group_by
メソッドは、配列項目でage
メソッドを呼び出して、データごとにグループを取得する必要があります。このage
メソッドは、あなたの場合ハッシュであるアイテムには定義されていません。
これは動作するはずです:
array.group_by { |d| d[:age] }
out = {}
array_of_hashes.each do |a_hash|
out[a_hash[:age]] ||= []
out[a_hash[:age]] << a_hash
end
または
array.group_by {|item| item[:age]}
他の人がRubyのSymbol#to_proc
メソッドが呼び出され、配列内の各ハッシュでage
メソッドを呼び出します。ここでの問題は、ハッシュがage
メソッドに応答しないことです。
これで、Hashクラスに1つ定義できますが、おそらくプログラムのすべてのハッシュインスタンスに1つは必要ありません。代わりに、配列の各ハッシュでage
メソッドを次のように定義するだけです。
array.each do |hash|
class << hash
def age
self[:age]
end
end
end
そして、group_by
前と同じように:
array = array.group_by &:age