PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sortierbare UUIDs und Überschreiben von ActiveRecord::Base

Zunächst einmal first und last sind nicht so einfach, wie Sie zu denken scheinen:Sie vernachlässigen das limit vollständig Argument, das beide Methoden unterstützen.

Zweitens, scope ist kaum mehr als eine ausgefallene Art, Klassenmethoden hinzuzufügen, die Abfragen zurückgeben sollen. Ihre Bereiche missbrauchen scope da sie einzelne Modellinstanzen statt Abfragen zurückgeben. Sie möchten scope nicht verwenden Überhaupt versuchen Sie nur, den first zu ersetzen und last Klassenmethoden, warum überschreiben Sie sie nicht einfach? Sie müssten sie jedoch ordnungsgemäß überschreiben, und dazu müssen Sie die Rails-Quelle lesen und verstehen, damit Sie richtig imitieren, was find_nth_with_limit tut. Sie möchten second überschreiben , third , ... und der Rest dieser dummen Methoden, wenn Sie schon dabei sind.

Wenn Sie sich nicht sicher fühlen, ersetzen Sie first und last (eine gute Sache IMO), dann könnten Sie einen Standardbereich hinzufügen, um die Dinge wie gewünscht zu ordnen:

default_scope -> { order(:created_at) }

Natürlich bringen Standard-Bereiche ihre eigenen Probleme mit sich, und Dinge wie diese in ORDER BY einzuschleusen, wird Sie wahrscheinlich dazu zwingen, reorder jederzeit, wenn Sie ORDER BY angeben möchten; Denken Sie daran, dass mehrere Aufrufe von order neue Bestellbedingungen hinzufügen, sie ersetzen keine bereits vorhandenen.

Wenn Sie Rails6+ verwenden, können Sie alternativ Markus' implicit_order_column verwenden Lösung um alle Probleme zu vermeiden, die Standardbereiche verursachen können.

Ich glaube, du gehst das alles falsch an. Jedes Mal, wenn ich M.first sehe Ich gehe davon aus, dass etwas vergessen wurde. Dinge nach id ordnen ist ziemlich nutzlos, also sollten Sie immer Geben Sie die gewünschte Reihenfolge manuell an, bevor Sie Methoden wie first verwenden und last .