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:
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:
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.
Tags und Links ruby-on-rails activerecord postgresql ruby-on-rails-4 uuid