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 :through
Beziehung 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_scope
Folgendes 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 order
als 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