À partir de Rails 4, vous feriez:
class Article < ActiveRecord::Base
has_many :comments, -> { order(created_at: :desc) }
end
class Comment < ActiveRecord::Base
belongs_to :article
end
Pour une has_many :through
relation, l'ordre des arguments est important (il doit être le deuxième):
class Article
has_many :comments, -> { order('postables.sort' :desc) },
:through => :postable
end
Si vous voulez toujours aux commentaires d'accès dans le même ordre peu importe le contexte , vous pouvez aussi le faire par l' default_scope
intérieur Comment
comme:
class Comment < ActiveRecord::Base
belongs_to :article
default_scope { order(created_at: :desc) }
end
Cependant, cela peut être problématique pour les raisons évoquées dans cette question .
Avant Rails 4, vous pouviez spécifier order
comme clé de la relation, comme:
class Article < ActiveRecord::Base
has_many :comments, :order => 'created_at DESC'
end
Comme Jim l'a mentionné, vous pouvez également utiliser sort_by
après avoir récupéré les résultats, bien que dans tous les ensembles de résultats de taille, cela soit beaucoup plus lent (et utilise beaucoup plus de mémoire) que de passer votre commande via SQL / ActiveRecord.
Si vous faites quelque chose où l'ajout d'un ordre par défaut est fastidieux pour une raison quelconque ou si vous souhaitez remplacer votre valeur par défaut dans certains cas, il est trivial de le spécifier dans l'action de récupération elle-même:
sorted = article.comments.order('created_at').all