2010-11-30 9 views
6

Tengo una OrderedHash, generado a partir de la respuesta here que tiene este aspecto:Rieles: Cómo ordenar/reordenar un OrderedHash

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

Por lo tanto, hay que solucionar el hash por el segundo valor, en orden descendiente. Intenté esto:

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

¿Cómo puedo reordenar este OrderedHash?

+0

@ respuesta de Shtééf se ve bien para mí, pero podría sugerir que el tratamiento de rubí como el rubí y no algún otro idioma? Es tentador pensar que estás tratando de hacer que Ruby se vea como php, lo que sería desafortunado. Quizás puedas explicar lo que esperas lograr la próxima vez. – noodl

Respuesta

8

Bueno, creo que simplemente puede usar :order => 'sum_deal_price ASC' en la llamada sum de la respuesta original.

Pero también puede hacerlo en Ruby, que es sólo un poco más complicado:

# 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

El orden por deal.price no parece funcionar. Los resultados que obtengo están en todo el mapa en comparación con el conjunto de resultados. Usando su segunda sugerencia funciona (¡excepto para el género !, tuve que usar {| a, b | b [1] <=> a [1]}), pero me preocupa el tiempo. Estoy viendo 80,000 registros, y convertirlos de un lado a otro toma bastante tiempo. –

+0

Whoops, buena captura. Se arregló la llamada de clasificación. No estoy seguro de si esto funcionará, pero podrías intentar ': order => 'sum_deal_price''? (O compruebe en el registro qué nombre de alias se asigna a la columna de resultado de SUMA.) –

+0

Eso lo hizo. Pude devolver los valores que necesitaba con solo una declaración sql. ¡Gracias! –

Cuestiones relacionadas