2011-08-21 14 views
30

Ben sağlamalarının bu dizi var:Bu karma dizisini nasıl gruplayabilirim?

- :name: Ben 
    :age: 18 
- :name: David 
    :age: 19 
- :name: Sam 
    :age: 18 

Ben grubun onları age tarafından gerek, bu yüzden bu hale:

array = array.group_by &:age 
: ben bu şekilde yapıyor çalıştı

18: 
- :name: Ben 
    :age: 18 
- :name: Sam 
    :age: 18 
19: 
- :name: David 
    :age: 19 

Ancak bu hatayı alıyorum:

NoMethodError (undefined method `age' for {:name=>"Ben", :age=>18}:Hash): 

Neyi yanlış yapıyorum? Rails 3.0.1 ve Ruby 1.9.2

cevap

77

kullanıyorum &:age, group_by yönteminin gruba veri almak için öğelerdeki age yöntemini çağırması gerektiği anlamına gelir. Bu age yöntemi, Hashes öğelerinde tanımlanmadı.

Bu çalışması gerekir:

array.group_by { |d| d[:age] } 
2
out = {} 
array_of_hashes.each do |a_hash| 
    out[a_hash[:age]] ||= [] 
    out[a_hash[:age]] << a_hash 
end 

veya başkaları Ruby'nin Symbol#to_proc yöntemi çağrılır işaret ve dizideki her karma üzerinde age yöntemini çağıran gibi

array.group_by {|item| item[:age]} 
0

. Buradaki problem, karmaların bir age yöntemine yanıt vermemesidir.

Şimdi Hash sınıfını tanımlayabiliriz, ancak muhtemelen programdaki her hash örneğini istemiyoruz. Bunun yerine basitçe şöyle dizideki her karma üzerinde age yöntemini tanımlayabilirsiniz:

array.each do |hash| 
    class << hash 
    def age 
     self[:age] 
    end 
    end 
end 

Sonra öyleydin gibi group_by kullanmadan önce:

array = array.group_by &:age