Se è necessario convalidare o meno un attributo booleano per l'inclusione in [ true, false ]
dipende interamente dal caso d'uso.
Hai correttamente identificato che, in assenza di validazione di altro codice, un campo booleano in Rails sarà sempre (dopo il tipo di coercizione) true
, false
o nil
. Rails non costringerà nil
a false
. Se imposti l'attributo booleano di un modello su nil
e lo salvi, l'attributo sarà nil
, non false
, quando lo recupererai dal database in un secondo momento.
Si può pensare a nil
come a un "terzo stato" per un campo booleano. Considera una semplice app di sondaggio che consente agli utenti di salvare un sondaggio incompleto da completare in seguito. Supponiamo che un utente salvi un sondaggio incompleto con la domanda "Mangi carne?" senza risposta. Non si desidera memorizzare false
nel database poiché ciò significherebbe che l'utente ha risposto "no". Quando l'utente torna per terminare il sondaggio, si desidera che tale domanda rimanga senza risposta, quindi si desidera memorizzare nil
nel database.
In casi come sopra, è opportuno (e necessario) non convalidare per l'inclusione in [ true, false ]
.
Tuttavia, come regola generale direi che in tutti gli altri casi, vale a dire. in ogni caso in cui non si dispone di uno specifico , occorre per i valori nil
: è necessario convalidare i campi booleani per l'inclusione in [ true, false ]
.
Naturalmente, se si fa permettono nil
è necessario fare attenzione perché, come sapete, è un valore nil
Falsey in Ruby. Dovrai controllare esplicitamente "nilness" in luoghi in cui potresti altrimenti affidarti alla verità o alla falsità di un valore. Cioè, invece di questo:
if !is_meat_eater
unanswered_questions << :is_meat_eater
end
... che non si comportano come previsto se is_meat_eater
è false
, è necessario controllare in modo esplicito per nil
:
if is_meat_eater.nil?
unanswered_questions << :is_meat_eater
end
sì, di solito non mi preoccupo. Se il campo è obbligatorio, puoi usare il trucco di inclusione sopra e per essere sicuro di mettere "nullo: falso" sulla colonna –
Se hai bisogno che il valore sia 'true' o' false' ma non 'nil' allora vuoi usare la convalida. Se 'true',' false' e 'nil' sono a posto, non è necessaria la convalida. Quale di questi è giusto per te dipende interamente dal tuo caso d'uso. –
@Jordan: Sto bene con zero fino a quando ruby lo convalida a false e non ci sono scenari che potrebbero interrompere il sistema. Ci sono? –