Como os valores são convertidos ao atribuir a um campo booleano no Rails ActiveRecord?
Versão curta da minha pergunta
No Rails ActiveRecord, se eu tiver um campo booleano e atribuir algo como "abc
"ou2
, então ele é lançado imediatamente parafalse
. O valor que1
é lançado paratrue
enil
permanece comonil
. Por que esse é o caso? Onde posso encontrar a documentação do Rails (ou a documentação do Ruby) que explica esse comportamento?
Versão longa da minha pergunta
Estou tendo dificuldade em entender como o Rails lida com tentativas de atribuir valores a umBoolean
campo em um modelo Rails. Por exemplo, digamos que eu tenho umWebsite
modelo que tem umString
campo chamado:domain
e umBoolean
campo chamado:can_ssl
.
Minha migração é assim:
class CreateWebsites < ActiveRecord::Migration
def change
create_table :websites do |t|
t.string :domain
t.boolean :can_ssl, :default => false
t.timestamps
end
end
end
No meu arquivo de modelo, adiciono algumas regras de validação, para que fique assim:
class Website < ActiveRecord::Base
validates :domain, :presence => true
validates :can_ssl, :inclusion => { :in => [true, false] }
end
Simples o suficiente. Com base no que eu fiz, eu souesperando este:can_ssl
só pode ser definido com os valorestrue
oufalse
, e nada mais. Qualquer outra coisa resultaria emvalid?
serfalse
.
Mas assim que começo a brincar no console, percebo que, tão cedo quanto a declaração de atribuição real, o valor que forneço está sendo reformulado paratrue
oufalse
(ounil
) Quais são as regras que regem como um valor é convertido como umBoolean
?
Exemplos do console:
w = Website.new
w.domain = 'stackoverflow.com'
w.can_ssl = true
w.can_ssl # => true
w.valid? # => true
w.can_ssl = nil
w.can_ssl # => nil
w.valid? # => false (so far so good)
w.can_ssl = 'abc'
w.can_ssl # => false (How did 'abc' become the value false?)
w.valid? # => true
w.can_ssl = 1
w.can_ssl # => true (I guess it makes sense that 1 casts to true)
w.valid? # => true
w.can_ssl = 2
w.can_ssl # => false (But anything other than 1 casts to false?)
w.valid? # => true
Então, com base no que eu fiz até agora, eupensar Eu posso concluir o seguinte:
Ao atribuir o valor1
outrue
para umBoolean
campo, o valor será imediatamente convertido comotrue
e depois atribuído.Ao atribuirnil
para umBoolean
campo, o campo é realmente atribuídonil
.Ao atribuir qualquer outra coisa (como umString
ou qualquer número que não seja1
), o valor será convertido imediatamente comofalse
.Estou entendendo isso corretamente? Estou faltando alguma coisa?
Estou tendo dificuldade em encontrar a documentaçãoBoolean
tipo de campo no Rails, o que pode me dar esclarecimentos sobre isso.