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
.