A partire da Rails 4, dovresti:
class Article < ActiveRecord::Base
has_many :comments, -> { order(created_at: :desc) }
end
class Comment < ActiveRecord::Base
belongs_to :article
end
Per una has_many :throughrelazione l'ordine degli argomenti è importante (deve essere il secondo):
class Article
has_many :comments, -> { order('postables.sort' :desc) },
:through => :postable
end
Se si vuole sempre ai commenti di accesso nello stesso ordine non importa il contesto si potrebbe anche farlo attraverso default_scopeall'interno Commentcome:
class Comment < ActiveRecord::Base
belongs_to :article
default_scope { order(created_at: :desc) }
end
Tuttavia questo può essere problematico per i motivi discussi in questa domanda .
Prima di Rails 4 potevi specificare ordercome chiave sulla relazione, come:
class Article < ActiveRecord::Base
has_many :comments, :order => 'created_at DESC'
end
Come ha detto Jim, puoi anche usare sort_by dopo aver recuperato i risultati, sebbene in qualsiasi set di risultati di dimensioni questo sarà significativamente più lento (e utilizzerà molta più memoria) rispetto all'ordinamento tramite SQL / ActiveRecord.
Se stai facendo qualcosa in cui l'aggiunta di un ordine predefinito è macchinoso per qualche motivo o desideri sovrascrivere il tuo predefinito in alcuni casi, è banale specificarlo nell'azione di recupero stessa:
sorted = article.comments.order('created_at').all