ใน 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