En primer lugar, first
y last
no son tan simples como parece pensar que son:está descuidando por completo el limit
argumento que ambos métodos admiten.
En segundo lugar, scope
es poco más que una forma elegante de agregar métodos de clase destinados a devolver consultas. Sus ámbitos están abusando de scope
porque devuelven instancias de modelo único en lugar de consultas. No quieres usar scope
en absoluto, solo estás tratando de reemplazar el first
y last
métodos de clase, así que ¿por qué no los anulas? Sin embargo, deberá anularlos correctamente y eso requerirá leer y comprender la fuente de Rails para que imite correctamente lo que find_nth_with_limit
lo hace. Querrás anular second
, third
, ... y el resto de esos métodos tontos mientras estás en eso.
Si no se siente bien con reemplazar first
y last
(algo bueno en mi opinión), entonces podría agregar un alcance predeterminado para ordenar las cosas como lo desee:
default_scope -> { order(:created_at) }
Por supuesto, los ámbitos predeterminados vienen con su propio conjunto de problemas y colar cosas en ORDER BY de esta manera probablemente lo obligue a llamar a reorder
cada vez que desee especificar el ORDEN POR; recuerda que varias llamadas a order
agregan nuevas condiciones de pedido, no reemplazan una que ya existe.
Alternativamente, si está usando Rails6+, puede usar implicit_order_column
de Markus solución
para evitar todos los problemas que pueden causar los ámbitos predeterminados.
Creo que lo estás haciendo todo mal. Cada vez que veo M.first
Supongo que algo se ha olvidado. Ordenar cosas por id
es bastante inútil, por lo que debe siempre especifique manualmente el orden que desea antes de usar métodos como first
y last
.