2012-03-10 9 views
5

Ho cercato un bel po 'ma non riesco a risolvere il problema.Ruby multiple group_by o mappa

Ho un modello correlato a tre altri modelli. Chiamiamolo città. Le città hanno un continente, un paese e una regione.

Quando seleziono alcune città che voglio tornare un OrderedHash o una matrice che assomiglia a questo:

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

Come posso fare questo?

+0

Qual è il problema con il solo raggruppamento per regione e quindi l'inserimento di tutte le regioni nell'hash appropriato? –

+4

Perché vuoi tradurre le istanze del modello di ActiveRecord che modellano in modo appropriato questi dati in un hash che rappresenta male i dati e manca di funzionalità? – coreyward

+0

È in Rails? –

risposta

6

gruppo Proprio per regione:

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 

Si noti che questo non impiega l'ordinamento, ma può essere facilmente adattato a fare. Tieni presente che l'ordine di inserimento degli hash viene mantenuto solo in Ruby 1.9+.