2010-11-30 4 views
6

Ich habe eine OrderedHash, aus der Antwort erzeugt here die wie folgt aussieht:Rails: Wie sortieren/Nachbestellung ein OrderedHash

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

Also, ich brauche den Hash durch den zweiten Wert zu sortieren, in absteigende Reihenfolge. Ich versuchte dies:

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

Wie kann ich diese OrderedHash neu anordnen?

+0

@ Shtééf Antwort auf mich sieht gut aus, aber könnte ich vorschlagen, die Behandlung von Rubin als Rubin und nicht eine andere Sprache? Es ist Zeit zu denken, dass Sie versuchen, Ruby wie PHP aussehen zu lassen, was bedauerlich wäre. Vielleicht könnten Sie erklären, was Sie beim nächsten Mal erreichen wollen. – noodl

Antwort

8

Nun, ich denke, Sie können einfach :order => 'sum_deal_price ASC' im sum Aufruf der ursprünglichen Antwort verwenden.

Sie können aber auch tun es in Ruby, es ist nur ein bisschen schwieriger:

# 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

Die Bestellung von deal.price scheint nicht zu funktionieren. Die Ergebnisse, die ich bekomme, sind überall auf der Karte im Vergleich zum Ergebnissatz. Mit Ihrem zweiten Vorschlag funktioniert (außer für die Sortierung !, musste ich {| a, b | b [1] <=> a [1]} verwenden), aber ich bin besorgt über die Zeit. Ich schaue mir 80.000 Datensätze an, und das Konvertieren dauert eine ganze Weile. –

+0

Hoppla, guter Fang. Der Sortieraufruf wurde korrigiert. Ich bin mir nicht sicher, ob das funktioniert, aber könntest du versuchen: 'order => 'sum_deal_price''? (Oder überprüfen Sie im Protokoll, welcher Aliasname der SUM-Ergebnisspalte zugewiesen ist.) –

+0

Das hat es getan. Ich konnte die Werte, die ich brauchte, nur mit einer SQL-Anweisung zurückgeben. Vielen Dank! –

Verwandte Themen