Sortierbare UUIDs und Überschreiben von ActiveRecord :: Base

9

Ich möchte UUIDs in einer App verwenden, die ich gerade erstelle, und stoße auf ein kleines Problem. Da UUIDs (v4) nicht sortiert werden können, weil sie zufällig generiert werden, versuche ich zuerst, ActiveRecord :: Base # zu überschreiben, aber Rails ist damit nicht sehr zufrieden. Es schreit mich an und sagt ArgumentError: You tried to define a scope named "first" on the model "Item", but Active Record already defined a class method with the same name. Muss ich eine andere Methode verwenden, wenn ich sortieren und sortieren möchte?

Hier ist die Soße:

%Vor%

Rails 4.2, Ruby 2.2.2

Referenz:

Nathaniel Kristofer Schweinber 14.06.2015, 03:08
quelle

1 Antwort

5

Zuerst first und last sind nicht so einfach, wie Sie zu sein scheinen: Sie vernachlässigen es völlig Das Argument limit , das beide Methoden unterstützen.

Zweitens ist scope wenig mehr als eine fantastische Möglichkeit, Klassenmethoden hinzuzufügen, die Abfragen zurückgeben sollen. Ihre Bereiche missbrauchen scope , weil sie einzelne Modellinstanzen und keine Abfragen zurückgeben. Sie möchten scope überhaupt nicht verwenden, Sie versuchen nur, die Klassenmethoden first und last zu ersetzen, also 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 genau nachahmen, was find_nth_with_limit tut dies. Sie sollten second , third , ... und den Rest dieser dummen Methoden überschreiben, während Sie gerade dabei sind.

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

%Vor%

Natürlich haben Standard-Scopes ihre eigenen Probleme und schleichen Dinge in ORDER BY, so dass Sie wahrscheinlich dazu gezwungen werden, reorder zu jeder Zeit, an der Sie ORDER BY wirklich angeben möchten; Beachten Sie, dass mehrere Aufrufe von order neue Bestellbedingungen hinzufügen, sie ersetzen jedoch keine bereits vorhandenen.

Ich denke, das geht alles falsch. Immer wenn ich M.first sehe, gehe ich davon aus, dass etwas vergessen wurde. Dinge nach id zu sortieren ist ziemlich nutzlos, daher solltest du immer manuell die gewünschte Reihenfolge angeben, bevor du Methoden wie first und last verwendest.

    
mu is too short 14.06.2015, 04:05
quelle