Pertama-tama, first
dan last
tidak sesederhana yang Anda pikirkan:Anda benar-benar mengabaikan limit
argumen yang didukung oleh kedua metode tersebut.
Kedua, scope
sedikit lebih dari cara yang bagus untuk menambahkan metode kelas yang dimaksudkan untuk mengembalikan kueri. Cakupan Anda menyalahgunakan scope
karena mereka mengembalikan contoh model tunggal daripada kueri. Anda tidak ingin menggunakan scope
sama sekali, Anda hanya mencoba mengganti first
dan last
metode kelas jadi mengapa Anda tidak menimpanya saja? Anda harus menimpanya dengan benar dan itu akan membutuhkan membaca dan memahami sumber Rails sehingga Anda meniru dengan benar apa find_nth_with_limit
melakukan. Anda ingin mengganti second
, third
, ... dan metode konyol lainnya saat Anda melakukannya.
Jika Anda tidak merasa benar tentang mengganti first
dan last
(hal yang baik IMO), maka Anda dapat menambahkan cakupan default untuk memesan hal-hal yang diinginkan:
default_scope -> { order(:created_at) }
Tentu saja, cakupan default datang dengan serangkaian masalah mereka sendiri dan menyelipkan hal-hal ke dalam ORDER BY seperti ini mungkin akan memaksa Anda untuk memanggil reorder
kapan saja Anda benar-benar ingin menentukan ORDER BY; ingat bahwa beberapa panggilan ke order
tambahkan ketentuan pemesanan baru, mereka tidak menggantikan yang sudah ada.
Atau, jika Anda menggunakan Rails6+, Anda dapat menggunakan implicit_order_column
Markus solusi
untuk menghindari semua masalah yang dapat disebabkan oleh cakupan default.
Saya pikir Anda akan tentang ini semua salah. Setiap kali saya melihat M.first
Saya berasumsi bahwa sesuatu telah dilupakan. Memesan barang dengan id
sangat tidak berguna sehingga Anda harus selalu tentukan secara manual urutan yang Anda inginkan sebelum menggunakan metode seperti first
dan last
.