【发布时间】:2014-03-13 08:09:19
【问题描述】:
我的问题的简短版本
在 Rails ActiveRecord 中,如果我有一个布尔字段并将其分配为“abc”或2,那么它会立即转换为false。值1 被转换为true,而nil 保持为nil。为什么会这样?在哪里可以找到解释此行为的 Rails 文档(或 Ruby 文档)?
我的问题的长版本
我很难理解 Rails 如何处理将值分配给 Rails 模型中的 Boolean 字段的尝试。例如,假设我有一个 Website 模型,其中有一个名为 :domain 的 String 字段和一个名为 :can_ssl 的 Boolean 字段。
我的迁移如下所示:
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 字段类型的文档,这可以让我澄清这一点。
【问题讨论】:
标签: ruby-on-rails activerecord boolean