sql >> Database >  >> RDS >> PostgreSQL

Sorteerbare UUID's en overschrijven van ActiveRecord::Base

Allereerst, first en last zijn niet zo eenvoudig als je lijkt te denken:je negeert volledig de limit argument dat beide methoden ondersteunen.

Ten tweede, scope is niet veel meer dan een mooie manier om klassenmethoden toe te voegen die bedoeld zijn om query's te retourneren. Uw scopes misbruiken scope omdat ze exemplaren van één model retourneren in plaats van query's. U wilt geen gebruik maken van scope helemaal niet, je probeert gewoon de first . te vervangen en last class-methoden, dus waarom overschrijf je ze niet gewoon? Je zou ze echter correct moeten overschrijven en dat vereist het lezen en begrijpen van de Rails-bron, zodat je goed nabootst wat find_nth_with_limit doet. U wilt second . overschrijven , third , ... en de rest van die dwaze methoden als je toch bezig bent.

Als u zich niet goed voelt over first vervangen en last (een goede zaak IMO), dan zou je een standaard bereik kunnen toevoegen om dingen naar wens te bestellen:

default_scope -> { order(:created_at) }

Natuurlijk hebben standaard scopes hun eigen problemen en als je dingen op deze manier in de ORDER BY sluipt, zul je waarschijnlijk gedwongen worden om reorder op elk moment dat u de ORDER BY wilt specificeren; onthoud dat meerdere oproepen om order voeg nieuwe bestelvoorwaarden toe, ze vervangen niet een die er al is.

Als u Rails6+ gebruikt, kunt u ook Markus's implicit_order_column gebruiken oplossing om alle problemen te vermijden die standaardbereiken kunnen veroorzaken.

Ik denk dat je dit helemaal verkeerd aanpakt. Elke keer dat ik M.first . zie Ik neem aan dat er iets vergeten is. Dingen bestellen op id is vrijwel nutteloos, dus u moet altijd geef handmatig de gewenste volgorde op voordat u methoden gebruikt zoals first en last .



  1. Hoe het volgende item in een lijst met MySQL-records op te halen?

  2. SQL transponeren volledige tabel

  3. Hoe TO_CHAR() werkt in MariaDB

  4. Fout bij opslaan van geodjango PointField