我的問題當分配給Rails ActiveRecord中的布爾字段時,如何賦值?
的短版在Rails ActiveRecord的,如果我有一個布爾字段,我給你類似爲「abc
」或2
,那麼它就會立即轉換爲false
。價值1
鑄造爲true
,nil
保持爲nil
。爲什麼會這樣?我在哪裏可以找到解釋此行爲的Rails文檔(或Ruby文檔)?
龍版我的問題
我難以理解的Rails如何處理嘗試分配在Rails模型值的Boolean
領域。例如,假設我有一個Website
模型,該模型的String
字段和Boolean
字段:can_ssl
。
我的遷移是這樣的:
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
在我的模型文件,我添加一些驗證規則,所以它看起來是這樣的:
class Website < ActiveRecord::Base
validates :domain, :presence => true
validates :can_ssl, :inclusion => { :in => [true, false] }
end
夠簡單。基於我所做的,我是期待,:can_ssl
只能設置爲值true
或false
,沒有別的。其他任何會導致valid?
爲false
。但是一旦我開始在控制檯中玩耍,我注意到,早在實際的賦值語句中,我提供的值將被重新改寫爲true
或false
(或nil
)。關於如何將價值轉化爲Boolean
的規則是什麼?從控制檯
例子:
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
那麼,根據什麼我迄今所做的,我想我可以得出以下結論:
- 當分配值
1
或true
到Boolean
字段,該值將立即投射爲true
,然後分配。 - 將
nil
分配給Boolean
字段時,該字段實際上被分配爲nil
。 - 當分配其他任何東西(例如
String
或任何非1
的數字)時,該值將立即變爲false
。
我的理解是否正確?我錯過了什麼?
我很難找到在Rails中的文檔Boolean
字段類型,可以給我澄清這一點。至少在我的版本軌(它可能會在較新版本的地方略有不同),特別是與
ActiveRecord::ConnectionAdapters::Column.value_to_boolean
:
這不是他問的問題:他問「爲什麼'abc'被保存爲」假「到布爾列」。 「abc」是紅寶石中的真理,這似乎是一個矛盾。 –