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 .