2009-11-14 7 views
0

J'ai une table de jointure que j'utilise pour trouver des services disponibles pour un bon de commande; dans cette table est le utility_id et un company_id.Ruby: Faire un hash à partir de Hash => Set

Ce que je veux est un groupe (hachage) où les clés sont les noms d'utilité et les valeurs sont des hachages des sociétés correspondantes.

je suis arrivé ce qui suit ...

Service.find(:all).to_set.classify { |service| Utility.find(service.utility_id).name } 

... qui me donne très bien un hachage dont les clés sont les noms des services publics, mais les valeurs sont Set s des enregistrements de service, non juste les noms de l'entreprise (je ne suis pas besoin des dossiers réels), et je ne peux pas comprendre comment je ferais le hachage Je veux:

# example of what I would like to have 
{"electricity" => {"conEd" => 1, "Dominian" => 2}, "gas" => {"conEd" => 1}} 
# where the key is Utility.name, and the value-hash is {Company.name => Company.id} 

Comment puis-je faire cela?

+0

Je suis confus au sujet de l'origine de "company-1". Si c'est juste une séquence numérique, ne préféreriez-vous pas avoir un tableau comme valeur de hachage? Donc: '{" utility-1 "=> [company_id, company_id]," utilitaire-2 "=> [société_id, société_id]}' – DigitalRoss

+0

Désolé; Je voulais dire qu'une «compagnie-1» n'était que le nom d'une compagnie distincte d'une autre «compagnie-2», et non pas qu'elles incrémentaient réellement les valeurs. Edité ci-dessus. – neezer

Répondre

1

find(:all) suggère Rails pour moi, donc en supposant que vous avez un HABTM entre les modèles utilitaires et de service correctement, cet extrait fonctionne pour mon environnement de test:

results = Hash.new 
Utility.find(:all).each do |utility| 
    results[utility.name] = Hash.new 
    utility.companies.each do |company| 
    results[utility.name][company.name] = company.id 
    end 
end 
results 

qui produit

{"Communications"=>{"InternetCo"=>2, "PhoneCo"=>1}, "Energy"=>{"ElectricCo"=>4, "GasCo"=>3, "OilCo"=>5}} 
+0

La relation HABTM (j'utilise has_many,: through) est en fait entre 'Company' et' Utility'; 'Service' est mon modèle de jointure. Et oui, j'utilise Rails (j'ai oublié de le mentionner). Comment est-ce que je changerais ce que vous avez écrit ci-dessus pour travailler avec mon installation? – neezer

+0

Modifié pour se conformer à vos objets de modèle. –