sql >> Base de Datos >  >> RDS >> PostgreSQL

UUID ordenables y anulación de ActiveRecord::Base

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 .