С 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
Однако это может быть проблематично для reasons discussed in this question.
Перед 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
Будьте осторожны, вы используете неожиданный метод: @ article.comments (перезарядка = ложь) предназначен для принудительного кэширования (для принудительной перезагрузки re ляционной). Если вы предоставляете хэш, это то же самое, что и @ article.comments (true). Не забудьте использовать .all (: order => '...'). Несколько раз сломал ногу. –