Начиная с Rails 4, вы должны сделать:
class Article < ActiveRecord::Base
has_many :comments, -> { order(created_at: :desc) }
end
class Comment < ActiveRecord::Base
belongs_to :article
end
Для отношения has_many :through
важен порядок аргументов (он должен быть вторым):
class Article
has_many :comments, -> { order('postables.sort' :desc) },
:through => :postable
end
Если вы всегда хотите получать доступ к комментариям в одном и том же порядке, независимо от контекста, вы также можете сделать это через default_scope
в Comment
, например:
class Comment < ActiveRecord::Base
belongs_to :article
default_scope { order(created_at: :desc) }
end
Однако это может быть проблематично по причинам, обсуждаемым в этом вопросе .
До Rails 4 вы могли указать order
в качестве ключа отношения, например:
class Article < ActiveRecord::Base
has_many :comments, :order => 'created_at DESC'
end
Как уже упоминал Джим, вы также можете использовать sort_by
после получения результатов, хотя в любых результирующих наборах размеров это будет значительно медленнее (и использовать намного больше памяти), чем при упорядочивании через SQL / ActiveRecord.
Если вы делаете что-то, когда добавление ордера по умолчанию по какой-то причине громоздко или вы хотите переопределить ваш дефолт в некоторых случаях, тривиально указать его в самом действии извлечения:
sorted = article.comments.order('created_at').all