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
関係については、引数の順序が重要です(2番目にする必要があります)。
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を介して順序を付けるよりも大幅に遅くなります(そしてメモリを多く使用します)。
なんらかの理由でデフォルトの順序を追加するのが煩わしい場合や、特定の場合にデフォルトを上書きしたい場合は、フェッチアクション自体で指定するのは簡単です。
sorted = article.comments.order('created_at').all