Ini sepertinya pertanyaan yang sangat sederhana tetapi saya belum melihatnya dijawab di mana pun.
Di rel jika Anda memiliki:
class Article < ActiveRecord::Base
has_many :comments
end
class Comments < ActiveRecord::Base
belongs_to :article
end
Mengapa Anda tidak bisa memesan komentar dengan sesuatu seperti ini:
@article.comments(:order=>"created_at DESC")
Ruang lingkup bernama berfungsi jika Anda perlu banyak referensi dan bahkan orang melakukan hal-hal seperti ini:
@article.comments.sort { |x,y| x.created_at <=> y.created_at }
Tapi ada yang memberitahuku bahwa ini harus lebih sederhana. Apa yang saya lewatkan?
ruby-on-rails
Brian Armstrong
sumber
sumber
Jawaban:
Anda dapat menentukan urutan sortir untuk koleksi telanjang dengan opsi pada
has_many
dirinya sendiri:Atau, jika Anda menginginkan metode pengurutan non-database yang sederhana, gunakan sort_by :
Mengumpulkan ini dengan metode pemesanan yang ditambahkan ActiveRecord:
Jarak tempuh Anda mungkin berbeda: karakteristik kinerja dari solusi di atas akan berubah secara drastis bergantung pada bagaimana Anda mengambil data di tempat pertama dan Ruby mana yang Anda gunakan untuk menjalankan aplikasi Anda.
sumber
-> { order(created_at: :desc) }
sebagai gantinya. Lihat: stackoverflow.com/questions/18284606/…Pada Rails 4, Anda akan melakukan:
Untuk suatu
has_many :through
hubungan, urutan argumen penting (harus menjadi yang kedua):Jika Anda selalu ingin mengakses komentar dalam urutan yang sama apa pun konteksnya, Anda juga dapat melakukannya melalui
default_scope
dalamComment
seperti:Namun ini bisa menjadi masalah karena alasan yang dibahas dalam pertanyaan ini .
Sebelum Rails 4 Anda dapat menentukan
order
sebagai kunci pada hubungan tersebut, seperti:Seperti yang disebutkan Jim, Anda juga dapat menggunakan
sort_by
setelah Anda mengambil hasil meskipun dalam kumpulan hasil apa pun ukurannya akan jauh lebih lambat (dan menggunakan lebih banyak memori) daripada melakukan pengurutan melalui SQL / ActiveRecord.Jika Anda melakukan sesuatu di mana menambahkan urutan default merepotkan karena suatu alasan atau Anda ingin menimpa default Anda dalam kasus tertentu, sangatlah mudah untuk menentukannya dalam tindakan pengambilan itu sendiri:
sumber
.order()
ke rantai metode, seperti pada contoh terakhir. Apakah ini yang Anda tanyakan?Jika Anda menggunakan Rails 2.3 dan ingin menggunakan pengurutan default yang sama untuk semua koleksi objek ini, Anda dapat menggunakan default_scope untuk memesan koleksi Anda.
Kemudian jika Anda menelepon
Mereka akan diurutkan sesuai default_scope Anda. TBH dalam arti yang sangat umum, pengurutan adalah satu-satunya penggunaan cakupan default yang sangat baik.
sumber
Anda dapat menggunakan metode find ActiveRecord untuk mendapatkan objek Anda dan mengurutkannya juga.
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
sumber
Dan jika Anda perlu menyampaikan beberapa argumen tambahan seperti
dependent: :destroy
atau apa pun, Anda harus menambahkan argumen setelah lambda, seperti ini:sumber