2010-11-30 18 views
6

J'ai une OrderedHash, produite à partir de la réponse here qui ressemble à ceci:Rails: Comment trier/réordonner une OrderedHash

<OrderedHash {2=>"534.45",7=>"10",153=>"85.0"}> 

, je dois donc pour trier le hachage par la deuxième valeur, Ordre décroissant. J'ai essayé ceci:

var.sort! {|a,b| b[1] <=> a[1]} 
NoMethodError: undefined method `sort!' for #<ActiveSupport::OrderedHash:0x127a50848> 

Comment puis-je réorganiser ce OrderedHash?

+0

@ réponse de Shtééf semble bon pour moi, mais pourrais-je suggérer le traitement de rubis comme rubis et pas une autre langue? Il est tentant de penser que vous essayez de faire ressembler rubis comme php, ce qui serait regrettable. Peut-être pourriez-vous expliquer ce que vous espérez accomplir la prochaine fois. – noodl

Répondre

8

Eh bien, je pense que vous pouvez simplement utiliser :order => 'sum_deal_price ASC' dans l'appel sum de la réponse originale.

Mais vous pouvez aussi le faire en Ruby, il est juste un peu plus compliqué:

# You can't sort a Hash directly, so turn it into an Array. 
arr = var.to_a # => [[2, "534.45"], [7, "10"], [153, "85.0"]] 
# Looks like there's a bunch of floats-as-strings in there, fix that. 
arr.map! { |pair| [pair.first, pair.second.to_f] } 
# Now sort it by the value (which is the second entry of the pair). 
arr.sort! { |a, b| a.second <=> b.second } 
# Turn it back into an OrderedHash. 
sorted_hash = ActiveSupport::OrderedHash[arr] 
+0

La commande par deal.price ne semble pas fonctionner. Les résultats obtenus sont partout sur la carte par rapport à l'ensemble des résultats. En utilisant votre deuxième suggestion fonctionne (sauf pour le sort !, j'ai dû utiliser {| a, b | b [1] <=> a [1]}), mais je suis préoccupé par l'heure. Je regarde 80 000 enregistrements, et les convertir d'avant en arrière prend beaucoup de temps. –

+0

Oups, bonne prise. Correction de l'appel de tri. Je ne suis pas sûr que cela fonctionne, mais pourriez-vous essayer ': order => 'sum_deal_price''? (Ou vérifiez dans le journal quel nom d'alias est affecté à la colonne de résultat SUM.) –

+0

Cela a été fait. J'ai été en mesure de retourner les valeurs dont j'avais besoin avec juste une déclaration SQL. Merci! –