A partir do Rails 4, você faria:
class Article < ActiveRecord::Base
has_many :comments, -> { order(created_at: :desc) }
end
class Comment < ActiveRecord::Base
belongs_to :article
end
Para um has_many :through
relacionamento, a ordem do argumento é importante (deve ser a segunda):
class Article
has_many :comments, -> { order('postables.sort' :desc) },
:through => :postable
end
Se você sempre vai querer comentários de acesso na mesma ordem não importa o contexto, você também pode fazer isso através de default_scope
dentro Comment
como:
class Comment < ActiveRecord::Base
belongs_to :article
default_scope { order(created_at: :desc) }
end
No entanto, isso pode ser problemático pelas razões discutidas nesta pergunta .
Antes do Rails 4, você podia especificar order
como uma chave no relacionamento, como:
class Article < ActiveRecord::Base
has_many :comments, :order => 'created_at DESC'
end
Como Jim mencionou, você também pode usar sort_by
depois de obter os resultados, embora em qualquer conjunto de resultados de tamanho isso seja significativamente mais lento (e use muito mais memória) do que fazer o pedido por meio de SQL / ActiveRecord.
Se você estiver fazendo algo em que adicionar uma ordem padrão seja complicado por algum motivo ou se quiser substituir seu padrão em certos casos, é trivial especificá-lo na própria ação de busca:
sorted = article.comments.order('created_at').all