2009-03-18 3 views
27

Ich habe ein kleines Beispiel Rails App namens Tickets, die fiktiven Tickets an verschiedene Kunden verkauft und verkauft. In tickets_controller.rb, innerhalb def index, ich habe diese Standard-Linie, die von Gerüsten erzeugt:Wie sortieren Sie normalerweise Elemente in Rails?

@tickets = Ticket.find(:all) 

Um die Karten zu sortieren nach Namen, habe ich zwei mögliche Ansätze gefunden. Sie können es auf diese Weise tun:

@tickets = Ticket.find(:all, :order => 'name') 

... oder so:

@tickets = Ticket.find(:all).sort!{|t1,t2|t1.name <=> t2.name} 

(Tipp: Ruby-Dokumentation erklärt, dass sort! das Array ändern wird, dass es das Sortieren, im Gegensatz zu sort allein , die das sortierte Array zurückgibt, aber das Original unverändert lässt).

Welche Strategie verwenden Sie normalerweise? Wann könnten Sie .sort! im Vergleich zur :order => 'criteria' Syntax verwenden?

Antwort

34

Verwenden Sie :order => 'criteria' für alles, was einfach von der Datenbank (dh in alphabetischer oder chronologischer Reihenfolge) getan werden kann. Wahrscheinlich ist es viel schneller, als es Ihrem Ruby-Code erlaubt, vorausgesetzt, Sie haben die richtigen Indizes an Ort und Stelle. Die einzige Zeit, die ich denken könnte, dass Sie die Methode sort verwenden sollten, ist, wenn Sie ein komplexes Attribut haben, das zur Laufzeit berechnet und nicht in der Datenbank gespeichert wird, wie ein "Vertrauenswürdigkeitswert" basierend auf der Anzahl der guten/schlechten Antworten oder so. In diesem Fall ist es besser, die Methode sort zu verwenden, aber beachten Sie, dass dies bei einer Paginierung Probleme verursacht (auf jeder Seite werden die ITS-Ergebnisse der Reihe nach angezeigt, aber die Seiten werden insgesamt nicht in Ordnung sein) .

+0

Interessant. Warum würde es die Paginierung vermasseln, wenn ich, sobald ich die Informationen aus der Datenbank gezogen habe, sortiere! es? Würde das nicht passieren, bevor es für die Paginierung/Anzeige übergeben wird? –

+4

Der Aufruf find/paginate wird die Daten in Blöcken von (sagen wir mal) 20 erhalten. Diese 20 werden aus der Datenbank herausgenommen, entsprechend der Reihenfolge, die Sie hatten, DANN sortiert nach Ihrer benutzerdefinierten Sortierfunktion. Dies bedeutet, dass die Seitenmenge nach der Klausel: order und jede Seite nach Ihrer Funktion sortiert wird. – Luke

+0

Danke für die ausgezeichneten Erklärungen! –

2

Ich gebe eine Reihenfolge im ActiveRecord-Finder oder in der Modellassoziation an, da das Sortieren mit SQL schneller ist. Sie sollten die Vorteile der RDBMS nutzen, wenn Sie dazu in der Lage sind.

Verwandte Themen