Ab Rails 4 würden Sie Folgendes tun:
class Article < ActiveRecord::Base
has_many :comments, -> { order(created_at: :desc) }
end
class Comment < ActiveRecord::Base
belongs_to :article
end
Für eine has_many :throughBeziehung ist die Reihenfolge der Argumente wichtig (sie muss an zweiter Stelle stehen):
class Article
has_many :comments, -> { order('postables.sort' :desc) },
:through => :postable
end
Wenn Sie unabhängig vom Kontext immer auf Kommentare in derselben Reihenfolge zugreifen möchten, können Sie dies auch über default_scopeFolgendes tun Comment:
class Comment < ActiveRecord::Base
belongs_to :article
default_scope { order(created_at: :desc) }
end
Dies kann jedoch aus den in dieser Frage diskutierten Gründen problematisch sein .
Vor Rails 4 können Sie orderals Schlüssel für die Beziehung Folgendes angeben :
class Article < ActiveRecord::Base
has_many :comments, :order => 'created_at DESC'
end
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:
sorted = article.comments.order('created_at').all