Що стосується 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