Начиная с 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