2012-03-10 12 views
5

Szukałem całkiem sporo, ale nie mogę obejść tego.Ruby multiple group_by lub map

Mam model, który jest powiązany z trzema innymi modelami. Nazwijmy to miastami. Miasta mają kontynent, kraj i region.

Kiedy wybrać kilka miast, które chcę wrócić jak OrderedHash lub tablicę, która wygląda tak:

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

Jak mogę to zrobić?

+0

Na czym polega problem z pogrupowaniem według regionu, a następnie wypchnięciem wszystkich regionów do odpowiedniego skrótu? –

+4

Dlaczego chcesz tłumaczyć instancje modelu ActiveRecord, które odpowiednio modelują te dane w hasz, który słabo reprezentuje dane i nie ma w nim funkcjonalności? – coreyward

+0

Czy to w Railsach? –

Odpowiedz

6

Tylko grupa od regionu:

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 

Należy pamiętać, że to nie zatrudnia sortowania, ale może być łatwo dostosowany do zrobienia. Pamiętaj, że kolejność wstawiania skrótów jest zachowywana tylko w Ruby 1.9+.