Ob Sie ein boolesches Attribut für die Aufnahme in [ true, false ]
validieren sollten, hängt vollständig von Ihrem Anwendungsfall ab.
Sie haben richtig erkannt, dass in der Abwesenheit der Validierung anderen Code, ein boolesches Feld in Rails wird es immer sein (nach Art Zwang) true
, false
oder nil
. Schienen werden nil
zu false
nicht zwingen. Wenn Sie das boolesche Attribut eines Modells auf nil
setzen und es speichern, lautet das Attribut nil
, nicht false
, wenn Sie es später aus der Datenbank abrufen.
Sie können sich nil
als einen "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 anzeigen 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 ist. Sie möchten also nil
in der Datenbank speichern.
In Fällen wie oben ist es angemessen (und notwendig) nicht für die Aufnahme 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 keine Werte für nil
haben, sollten Sie boolesche Felder für die Aufnahme in [ true, false ]
validieren.
Natürlich, wenn Sie tun erlauben nil
Sie brauchen, vorsichtig zu sein, weil, wie Sie wissen, nil
ein in Ruby Falsey Wert ist. 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 dies:
if !is_meat_eater
unanswered_questions << :is_meat_eater
end
..., die wie beabsichtigt nicht benehmen, wenn is_meat_eater
false
ist, müssen Sie explizit für nil
überprüfen:
if is_meat_eater.nil?
unanswered_questions << :is_meat_eater
end
ja, stört mich normalerweise nicht. Wenn das Feld obligatorisch ist, können Sie den obigen Inklusionstrick verwenden und sicherstellen, dass "null: false" in die Spalte –
gesetzt wird. Wenn Sie den Wert "true" oder "false" benötigen, aber nicht "nil", dann Sie möchten die Validierung verwenden. Wenn 'true',' false' und 'nil' in Ordnung sind, brauchen Sie die Validierung nicht. Welche davon für Sie richtig ist, hängt ganz von Ihrem Anwendungsfall ab. –
@ Jordan: Ich bin cool mit Null, solange Ruby es auf falsch validiert und es gibt keine Szenarien, die das System brechen könnten. Sind da irgendwelche? –