PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

UUID ordinabili e sovrascrittura di ActiveRecord::Base

Prima di tutto, first e last non sono così semplici come sembri pensare che siano:stai completamente trascurando il limit argomento supportato da entrambi i metodi.

In secondo luogo, scope è poco più di un modo elegante per aggiungere metodi di classe destinati a restituire query. I tuoi ambiti stanno abusando di scope perché restituiscono istanze di modello singolo anziché query. Non vuoi usare scope stai solo cercando di sostituire il first e last metodi di classe, quindi perché non li sovrascrivi? Dovresti tuttavia sovrascriverli correttamente e ciò richiederà la lettura e la comprensione della fonte di Rails in modo da imitare correttamente ciò che find_nth_with_limit fa. Vorresti sostituire second , third , ... e il resto di quegli stupidi metodi già che ci sei.

Se non ti senti a posto, sostituisci first e last (una buona cosa IMO), quindi potresti aggiungere un ambito predefinito per ordinare le cose come desideri:

default_scope -> { order(:created_at) }

Naturalmente, gli ambiti predefiniti hanno una serie di problemi e intrufolarsi in ORDER BY in questo modo probabilmente ti costringerà a chiamare reorder ogni volta che si desidera effettivamente specificare l'ORDINE PER; ricorda che più chiamate per order aggiungi nuove condizioni di ordinazione, non ne sostituiscono una già presente.

In alternativa, se stai utilizzando Rails6+, puoi utilizzare implicit_order_column di Markus soluzione per evitare tutti i problemi che possono causare gli ambiti predefiniti.

Penso che stai sbagliando tutto questo. Ogni volta che vedo M.first Presumo che qualcosa sia stato dimenticato. Ordinare cose tramite id è praticamente inutile, quindi dovresti sempre specifica manualmente l'ordine che desideri prima di utilizzare metodi come first e last .