2012-03-10 17 views
5

He buscado bastante, pero no puedo entender esto.Ruby multiple group_by o map

Tengo un modelo que está relacionado con otros tres modelos. Vamos a llamarlo ciudades. Las ciudades tienen un continente, un país y una región.

Cuando selecciono algunas ciudades que quiero volver una OrderedHash o una matriz que se parece a esto:

{ 'Continent 1' => {'Country 1' => { 'Region 1' => { 'City 1', 'City 2' }}}, 'Continent 2' ...} 

¿Cómo puedo hacer esto?

+0

¿Cuál es el problema con solo agrupar por región y luego rellenar todas las regiones en el hash apropiado? –

+4

¿Por qué quieres traducir las instancias del modelo ActiveRecord que modelan adecuadamente estos datos en un hash que representa pobremente los datos y carece de funcionalidad? – coreyward

+0

¿Esto está en Rails? –

Respuesta

6

grupo acaba por región:

cities_by_region = City.all(:group => :region) 

# set up an automatic 3-level hash... 
result = Hash.new { |h,k| h[k] = Hash.new { |h,k| h[k] = {}}} 

cities_by_region.each do |region, cities| 
    country = region.country 
    result[country.continent.name][country.name][region.name] = cities 
end 

Tenga en cuenta que este no emplea la clasificación, pero se puede adaptar fácilmente para hacerlo. Tenga en cuenta que el orden de inserción de hashes solo se conserva en Ruby 1.9+.