Od Rails 4 zrobiłbyś:
class Article < ActiveRecord::Base
has_many :comments, -> { order(created_at: :desc) }
end
class Comment < ActiveRecord::Base
belongs_to :article
end
W przypadku has_many :throughrelacji kolejność argumentów ma znaczenie (musi być druga):
class Article
has_many :comments, -> { order('postables.sort' :desc) },
:through => :postable
end
Jeśli zawsze będziesz chciał komentarzach dostępu w tej samej kolejności, bez względu na kontekst, można również zrobić to za pośrednictwem default_scopewewnątrz Commentjak:
class Comment < ActiveRecord::Base
belongs_to :article
default_scope { order(created_at: :desc) }
end
Jednak może to być problematyczne z powodów omówionych w tym pytaniu .
Przed Railsami 4 można było określić orderjako klucz relacji, na przykład:
class Article < ActiveRecord::Base
has_many :comments, :order => 'created_at DESC'
end
Jak wspomniał Jim, możesz również użyć sort_bypo pobraniu wyników, chociaż w każdym zestawie wyników o rozmiarze będzie to znacznie wolniejsze (i zużyje o wiele więcej pamięci) niż przy zamawianiu przez SQL / ActiveRecord.
Jeśli robisz coś, w którym dodanie domyślnego zamówienia jest z jakiegoś powodu uciążliwe lub chcesz zastąpić domyślne w niektórych przypadkach, trywialne jest określenie tego w samej akcji pobierania:
sorted = article.comments.order('created_at').all