Dies scheint eine wirklich einfache Frage zu sein, aber ich habe nirgendwo eine Antwort darauf gesehen.
In Schienen, wenn Sie haben:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
Warum können Sie die Kommentare nicht mit so etwas bestellen:
@article.comments(:order=>"created_at DESC")
Der benannte Bereich funktioniert, wenn Sie häufig darauf verweisen müssen und sogar Leute solche Dinge tun:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Aber irgendetwas sagt mir, dass es einfacher sein sollte. Was vermisse ich?
ruby-on-rails
Brian Armstrong
quelle
quelle
Antworten:
Sie können die Sortierreihenfolge für die bloße Sammlung mit einer Option für sich
has_many
selbst angeben :Wenn Sie eine einfache Sortiermethode ohne Datenbank wünschen, verwenden Sie sort_by :
Sammeln Sie dies mit den von ActiveRecord hinzugefügten Bestellmethoden:
Ihr Kilometerstand kann variieren: Die Leistungsmerkmale der oben genannten Lösungen ändern sich stark, je nachdem, wie Sie Daten zuerst abrufen und mit welchem Ruby Sie Ihre App ausführen.
quelle
-> { order(created_at: :desc) }
stattdessen ein Lambda . Siehe: stackoverflow.com/questions/18284606/…Ab Rails 4 würden Sie Folgendes tun:
Für eine
has_many :through
Beziehung ist die Reihenfolge der Argumente wichtig (sie muss an zweiter Stelle stehen):Wenn Sie unabhängig vom Kontext immer auf Kommentare in derselben Reihenfolge zugreifen möchten, können Sie dies auch über
default_scope
Folgendes tunComment
:Dies kann jedoch aus den in dieser Frage diskutierten Gründen problematisch sein .
Vor Rails 4 können Sie
order
als Schlüssel für die Beziehung Folgendes angeben :Wie Jim sagte, können Sie auch verwenden
sort_by
nachdem Sie Ergebnisse abgerufen haben, obwohl dies in allen Ergebnismengen der Größe erheblich langsamer ist (und viel mehr Speicher benötigt) als Ihre Bestellung über SQL / ActiveRecord.Wenn Sie etwas tun, bei dem das Hinzufügen einer Standardreihenfolge aus irgendeinem Grund umständlich ist oder Sie Ihre Standardreihenfolge in bestimmten Fällen überschreiben möchten, ist es trivial, sie in der Abrufaktion selbst anzugeben:
quelle
.order()
der Methodenkette wie im letzten Beispiel hinzufügen . Fragen Sie das?Wenn Sie Rails 2.3 verwenden und für alle Sammlungen dieses Objekts dieselbe Standardreihenfolge verwenden möchten, können Sie Ihre Sammlung mit default_scope ordnen.
Dann, wenn Sie anrufen
Sie werden gemäß Ihrem default_scope bestellt. TBH ist im Allgemeinen die einzige wirklich gute Verwendung von Standardbereichen.
quelle
Mit der Suchmethode von ActiveRecord können Sie Ihre Objekte abrufen und auch sortieren.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
quelle
Und wenn Sie einige zusätzliche Argumente wie
dependent: :destroy
oder was auch immer übergeben müssen, sollten Sie die nach einem Lambda wie folgt anhängen:quelle