Wie kann ich ein von einer ActiveRecord-Abfrage zurückgegebenes Array nach einer Datumsspalte sortieren created_at
?
Dies tritt auf, sobald die Abfrage ausgeführt wurde.
Bitte sagen Sie mir nicht, dass ich es in der Abfrage tun soll, da dies in der Ansicht erforderlich ist.
ruby-on-rails
ruby
arrays
activerecord
user94154
quelle
quelle
sort
ist flexibler - Sie geben das gesamte Vergleichsprädikat an, währendsort_by
Sie ihm nur mitteilen, was verglichen werden soll, und dies unter Verwendung des Standardprädikatssort
tun. Dieser Fall, in dem Sie eine Methode aufrufen und anhand des Ergebnisses sortieren, ist weit verbreitet -sort_by
nur eine präzisere Schreibweise.sort_by
ist für einfache Keysets aufgrund der Schwartzschen Transformation teurer, siehe ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_byWährend Ruby Enumerable fantastisch ist, geben ActiveRecord-Abfragen tatsächlich eine ActiveRecord :: Relation zurück, deren Abfrage noch nicht ausgewertet wurde (Lazy Loading), und es kann die Order-Methode aufgerufen werden, um diese Verarbeitung in die Datenbank zu laden, in der sie skaliert wird viel besser als eine auf Enumerable basierende Strategie.
Die Verwendung von Enumerable zum Sortieren verwirrt auch die Paginierung in der Datenbank. Nichts hindert die Auftragsstrategie daran, in der Ansicht angewendet zu werden. Ich würde dies jedoch eher auf das Modell übertragen.
sorted = @records.order(:created_at)
quelle
Rufen Sie einfach sort für die Sammlung auf und übergeben Sie den Codeblock, der Ruby mitteilt, wie er sortiert werden soll:
collection.sort { |a,b| a.created_at <=> b.created_at }
quelle
.sort_by
diesem Fall viel zu ineffizient . Bitte überprüfen Sie die andere Antwort von Chuck.Bitte schauen Sie sich diese an und überprüfen Sie auch die Komplexität.
Model.all.sort_by{|m| m.created_at} #=> O(log n) #versus Model.order(“created_at DESC”) #=> O(1)
quelle
Die beste Methode zum Sortieren des ActiveRecord-Arrays ist die Verwendung der Standardmethodenreihenfolge
Dies ist die schnellste und am besten geeignete Lösung, da in diesem Fall ein sortiertes Array von db zurückgegeben wird und Sie dafür keine andere Operation in der Klasse verwenden müssen. Wenn Sie beispielsweise die vorgeschlagene Operation verwenden,
sort_by
wird jedes Element des Arrays in einer Schleife ausgelöst. und danach wird es kein ActiveRecord-Array mehr sein, meiner Meinung nach nicht cool.order
kann Strings und Sumbols verwenden, ist sehr nützlich und benötigt mehrere Parameterquelle