gpt4 book ai didi

ruby-on-rails - 在Rails ActiveRecord中分配给 boolean 字段时如何转换值?

转载 作者:行者123 更新时间:2023-12-04 03:43:56 25 4
gpt4 key购买 nike

我的问题的简短版本

在Rails ActiveRecord中,如果我有一个 boolean 字段,并为其分配了类似“abc”或2的名称,则它将立即转换为false。值1强制转换为true,而nil保留为nil。为什么会这样呢?在哪里可以找到解释此行为的Rails文档(或Ruby文档)?

我的问题的长版

我很难理解Rails如何处理在Rails模型中将值分配给Boolean字段的尝试。例如,假设我有一个Website模型,该模型具有一个称为String:domain字段和一个名为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只能设置为 truefalse值,而不能设置其他任何值。任何其他情况都将导致 valid?false

但是,一旦我开始在控制台中玩转,我注意到,早在实际的赋值语句之前,我提供的值就被重铸为 truefalse(或 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

因此,根据我到目前为止所做的事情,我认为可以得出以下结论:
  • 将值1true分配给Boolean字段时,该值将立即转换为true,然后进行分配。
  • nil分配给Boolean字段时,该字段实际上被分配了nil
  • 在分配其他任何内容(例如String或非1的任何数字)时,该值将立即转换为false

  • 我理解正确吗?我有什么想念的吗?

    我在Rails中很难找到有关 Boolean字段类型的文档,这可以使我对此有所澄清。

    最佳答案

    这是在ActiveRecord的肠道中完成的:特别是

    ActiveRecord::ConnectionAdapters::Column.value_to_boolean

    至少在我的Rails版本中(在最新版本中可能有所不同)。

    这是我版本中的源
        # File activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb, line 144
    144: def value_to_boolean(value)
    145: if value.is_a?(String) && value.blank?
    146: nil
    147: else
    148: TRUE_VALUES.include?(value)
    149: end
    150: end

    TRUE_VALUES定义为
    #activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb:10:      
    TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set

    1、0,“f”和“t”之所以存在是因为流行的DBMS,例如MySql和PostgreSql,它们分别将 boolean 值存储为0/1和“f”/“t”。

    值得注意的是,这与在Ruby/Rails中通过“if”测试的内容之间的区别,即“真”或“虚假”的值(“假”值将在if测试中失败,“真”值将通过) 。

    在Ruby中, nilfalse是“falsy”,而从字面上 来看,其他(包括0,空数组,空字符串,空哈希等)都是“真实的”。因此,在ruby中被认为是真/伪的东西与以真/假形式保存到 boolean 数据库列的东西之间存在巨大差异。

    关于ruby-on-rails - 在Rails ActiveRecord中分配给 boolean 字段时如何转换值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372593/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com