Validiertes oder nicht validiertes boolesches Feld

8

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?

    
sudo bangbang 13.01.2016, 05:34
quelle

3 Antworten

8

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.

Als Faustregel würde ich jedoch sagen, dass in allen anderen Fällen - d. In jedem Fall, in dem Sie keinen spezifischen Bedarf für 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:

%Vor%

... was sich nicht wie beabsichtigt verhält, wenn is_meat_eater ist false , Sie müssen explizit nach nil suchen:

%Vor%     
Jordan Running 13.01.2016, 07:02
quelle
4

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.

    
Richard Peck 13.01.2016 11:06
quelle
0

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 .

    
yez 13.01.2016 05:43
quelle