Gibt es irgendwelche Vorteile bei der Validierung für boolesche Felder von Modellen?
Ich hatte eine Validierung, um das Vorhandensein eines booleschen Feldes sicherzustellen
%Vor%Es ist fehlgeschlagen, als boolean_attribute false war. Ich googelte herum und fand diese SO-Fragen in Bezug auf das Thema.
Rails-Datenbankstandardwerte und Modellüberprüfung für boolesche Felder
Rails validates_presence nicht validieren auf Boolean?
Dann wurde stattdessen diese Validierung hinzugefügt
%Vor%Das hat mich zum Nachdenken gebracht. Brauche ich irgendwelche Validierungen für boolsche Felder? Sein Wert wird immer wahr oder falsch oder nicht wahr sein? Selbst wenn jemand böswillig versucht, es zu ändern, um eine Zahl zu sagen, würde sich der Typ nicht darum kümmern? Oder gibt es eine Sicherheit, die die obige Einschlussvalidierung bietet?
Ob Sie ein boolesches Attribut für die Einbindung in [ true, false ]
validieren sollten, hängt vollständig von Ihrem Anwendungsfall ab.
Sie haben richtig erkannt, dass ein boolesches Feld in Rails in Ermangelung einer Validierung eines anderen Codes immer (nach Typenkoerziation) true
, false
oder nil
ist. Schienen werden nil
nicht zu false
zwingen. Wenn Sie das boolesche Attribut eines Modells auf nil
setzen und es speichern, ist das Attribut nil
, nicht false
, wenn Sie es später aus der Datenbank holen.
Sie können sich nil
als "dritten Zustand" für ein boolesches Feld vorstellen. Betrachten Sie eine einfache Umfrage-App, mit der Benutzer eine nicht abgeschlossene Umfrage speichern können, um sie später abzuschließen. Angenommen, ein Benutzer speichert eine unvollständige Umfrage mit der Frage "Isst du Fleisch?" unbeantwortet. Sie möchten false
nicht in der Datenbank speichern, da dies bedeuten würde, dass der Benutzer mit "Nein" geantwortet hat. Wenn der Benutzer zurückkehrt, um die Umfrage zu beenden, möchten Sie, dass diese Frage immer noch unbeantwortet bleibt. Sie möchten also nil
in der Datenbank speichern.
In Fällen wie den obigen ist es angemessen (und notwendig) nicht für die Einbeziehung in [ true, false ]
zu validieren.
nil
-Werte haben, sollten Sie boolesche Felder für die Einbindung in [ true, false ]
validieren.
Wenn Sie >> nil
zulassen, müssen Sie natürlich vorsichtig sein, denn wie Sie wissen, ist nil
ein falscher Wert in Ruby. Sie müssen explizit nach "Nilness" an Orten suchen, an denen Sie sich sonst auf die Wahrheit oder Falschheit eines Wertes verlassen könnten. Das heißt, statt dessen:
... was sich nicht wie beabsichtigt verhält, wenn is_meat_eater
ist false
, Sie müssen explizit nach nil
suchen:
Sie müssen kein boolean
-Feld validieren, wenn es nicht wahr ist, ist es falsch .
Just setzen Sie einen "Standard" in Ihrer db , so dass der Bool immer eine haben wird bestimmter Wert, egal was:
%Vor%Auf diese Weise würde ich keine Validierungen hinzufügen. Das System stellt sicher, dass Sie es entweder als wahr oder falsch setzen - was Ihnen als Entwickler überlassen bleibt.
Wenn Sie eine echte Typvalidierung wünschen, würde ich sagen, dass Sie das validates_type
-Stein ausprobieren sollten. Es führt eine Validierung Ihres Attributs vor Typ durch. Type-Nötigung kann ein unerwartetes Verhalten haben, diese Antwort zeigt, wie nur eine bestimmte Menge von Werten "truthig" ist.
Wenn du Boolean
als nil
akzeptierst, ist das nicht wirklich ein Boolean
richtig? Das ist entweder true
, false
oder ein dritter Wert, nil
.
Tags und Links ruby ruby-on-rails activerecord