Trước hết, first
và last
không đơn giản như bạn nghĩ:bạn đang hoàn toàn bỏ qua limit
lập luận rằng cả hai phương pháp đó đều hỗ trợ.
Thứ hai, scope
không chỉ là một cách ưa thích để thêm các phương thức lớp nhằm mục đích trả về các truy vấn. Phạm vi của bạn đang lạm dụng scope
bởi vì chúng trả về các cá thể mô hình đơn lẻ chứ không phải là các truy vấn. Bạn không muốn sử dụng scope
hoàn toàn, bạn chỉ đang cố gắng thay thế first
và last
các phương thức lớp vậy tại sao bạn không ghi đè chúng? Tuy nhiên, bạn cần phải ghi đè chúng đúng cách và điều đó sẽ yêu cầu đọc và hiểu nguồn Rails để bạn bắt chước đúng những gì find_nth_with_limit
làm. Bạn muốn ghi đè second
, third
, ... và phần còn lại của những phương pháp ngớ ngẩn đó khi bạn đang sử dụng nó.
Nếu bạn cảm thấy không ổn, hãy thay thế first
và last
(một điều tốt là IMO), sau đó bạn có thể thêm một phạm vi mặc định để sắp xếp mọi thứ như mong muốn:
default_scope -> { order(:created_at) }
Tất nhiên, phạm vi mặc định đi kèm với tập hợp các vấn đề của riêng chúng và việc lén đưa mọi thứ vào ORDER BY như thế này có thể sẽ buộc bạn phải gọi reorder
bất cứ lúc nào bạn thực sự muốn chỉ định ORDER BY; hãy nhớ rằng nhiều cuộc gọi đến order
thêm điều kiện đặt hàng mới, chúng không thay thế điều kiện đã có.
Ngoài ra, nếu bạn đang sử dụng Rails6 +, bạn có thể sử dụng implicit_order_column
của Markus giải pháp
để tránh tất cả các vấn đề mà phạm vi mặc định có thể gây ra.
Tôi nghĩ rằng bạn đang đi về điều này hoàn toàn sai. Bất cứ lúc nào tôi thấy M.first
Tôi cho rằng một cái gì đó đã bị lãng quên. Đặt hàng theo id
khá là vô ích, vì vậy bạn nên luôn luôn chỉ định thủ công thứ tự bạn muốn trước khi sử dụng các phương pháp như first
và last
.