从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
正如Jim所提到的,您可以sort_by
在获取结果后使用它,尽管在任何大小的结果集中,这都比通过SQL / ActiveRecord进行排序要慢得多(并且要使用更多的内存)。
如果您出于某种原因在添加默认订单的过程中很麻烦,或者在某些情况下想要覆盖默认订单,则在fetching操作本身中指定它很简单:
sorted = article.comments.order('created_at').all