Ich habe eine Datenbanktabelle mit einem bestimmten Feld, das nach dem Einfügen in die Datenbank nicht mehr aktualisiert werden kann. Wie kann ich meinem Modell mitteilen, dass es die Aktualisierung eines bestimmten Feldes nicht zulassen soll?Wie mache ich ein Datenbankfeld in Rails schreibgeschützt?
Antwort
Sie wollen attr_readonly
verwenden:
Attribute als nur lesbar aufgeführt wird verwendet werden, um einen neuen Datensatz zu erstellen, aber Update-Operationen werden diese Felder ignorieren.
class Customer < ActiveRecord::Base
attr_readonly :your_field_name
end
Und das Feld ist immer und per Definition „richtige“ (das heißt eine genaue Darstellung der Realität) zum Zeitpunkt des Einsetzens?
Kein Benutzer macht jemals einen Fehler bei der Eingabe dieses Feldes für die erste (und nur in Ihrem Schema) Zeit?
Tatsächlich gibt der Benutzer es überhaupt nicht ein, es wird vom Controller eingestellt. Was ich verhindern will, ist, dass jemand es mit einer veränderten Post-Anfrage modifiziert. – fresskoma
In diesem Fall wollen Sie sich nicht mit "readonly" -Feldern herumschlagen. Sie möchten die Anweisung attr_protected in Ihrem Modell verwenden, um zu verhindern, dass das Feld durch Massenaktualisierungen geändert wird. Noch besser: Verwenden Sie 'attr_accessible', um nur ausgewählte Felder für Massenupdates verfügbar zu machen. – averell
Um hier reinzukommen: Ich denke, der richtige Anwendungsfall von attr_readonly ist, wenn das Ändern dieses Feldes Ihre Datenintegrität zerstören würde. Ich habe ein Feld: valid_at, und das Ändern dieses Feldes sollte nie passieren, da es bedeuten würde, dass etwas mit Kernalgorithmen nicht stimmt. Wenn das passiert, ist alles an Deck. Alle Daten könnten schlecht sein. Daher sollte ich es niemals ändern müssen und würde lieber davor bewahren, dass es durch einen Fehler in anderem Code verändert wird. Wenn es jemals versucht wird geändert zu werden, möchte ich sehr laut aufblasen. – Houen
Dies ist die richtige Antwort auf Ihre Frage, aber "richtige" Lösung für Ihr Problem ist ein bisschen anders ... siehe den Kommentar zu der anderen Frage. – averell
Ansonsten +1 auf die Antwort. – averell