分配给 Rails ActiveRecord 中的布尔字段时,值如何转换?

2024-04-04

我的问题的简短版本

在 Rails ActiveRecord 中,如果我有一个布尔字段并且我给它分配类似“abc" or 2,然后它立即转换为false。价值1被投射到true, and nil仍然是nil。为什么会这样呢?在哪里可以找到解释此行为的 Rails 文档(或 Ruby 文档)?

我的问题的长版本

我很难理解 Rails 如何处理为 a 赋值的尝试BooleanRails 模型中的字段。例如,假设我有一个Website模型有一个String字段称为:domain and a 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

够简单的。根据我所做的事情,我期待 that :can_ssl只能设置为值true or false,没有别的。其他任何事情都会导致valid? being false.

但是,一旦我开始在控制台中玩耍,我注意到,早在实际的赋值语句中,我提供的值就被重新转换为true or false (or nil)。控制值如何转换为 a 的规则是什么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

所以,根据我迄今为止所做的事情,我think我可以得出以下结论:

  • 赋值时1 or true to a Boolean字段,该值将立即被转换为true然后分配。
  • 分配时nil to a Booleanfield,该字段实际被赋值nil.
  • 当分配其他任何东西时(例如String或任何不是的数字1),那么该值将立即被转换为false.

我的理解正确吗?我错过了什么吗?

我很难找到文档BooleanRails 中的字段类型可以让我对此进行澄清。


这是在 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)将书籍分别存储为 0/1 和“f”/“t”。

值得注意的是,这与 Ruby/Rails 中通过“if”测试的值之间的区别,即“true”或“falsy”值(“falsy”值将失败 if 测试,“truthy”值将通过) 。

在红宝石中,nil and false从字面上看是“虚假的”anythingelse(包括 0、空数组、空字符串、空哈希等)是“true”。因此,Ruby 中被视为真/假的内容与保存为布尔数据库列的真/假之间存在巨大差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分配给 Rails ActiveRecord 中的布尔字段时,值如何转换? 的相关文章

  • Rails:如何在setter方法中使父属性可用

    Context 我有一个company模型有很多projects 有很多tasks The company也有很多employees 这又具有许多tasks Schema Problem 我正在构建一个表单来创建一个项目 用户可以在其中添加
  • Zurb Foundation 5,modernizr 未找到

    我在生产模式下使用 Foundation 5 0 2 0 时遇到此问题 在 Rails Unicorn NginX 和 Ubuntu 上 NetworkError 404 Not Found http mydomain com javasc
  • Rails form_for :remote=>true 没有调用 js 方法

    我不知道为什么这不起作用 我正在学习 Rails 我正在关注一本书 它说要这样做 div class field div div class field div
  • 文件上传字段导致 ActionController::InvalidAuthenticityToken 异常

    使用 Rails 4 并尝试使用 simple form 和回形针将文件字段添加到现有表单 这是表格的关键部分 一切正常 除非我实际提交带有上传文件的表单 然后 我得到这个 ActionController InvalidAuthentic
  • Rails 渲染不必要的信息

    我一直在使用 RoR 和 Bootstrap 我试图将我的代码渲染成我在网上找到的片段 基本上我的索引中有这个 div class col md 6 div class well well sm div class row p p p p
  • 如何使用 ActionText 显示嵌入视频

    我正在尝试在 Rails 6 上使用 ActionText 显示嵌入式视频 无论是在 WYSIWYG Trix 中还是在渲染的内容中 但是 ActionText 渲染器会过滤所有原始 html 代码 并强制我使用 JS 在渲染内容中显示 i
  • Rails:如何将替代 Accept: content-types 视为 JSON?

    到目前为止我已经找到了两种方法request format json 在 Rails 中为 true 即传入请求被视为 JSON 一种是如果您请求资源并以 json另一个是如果您提供标头Accept application json在你的要
  • Rails 是否支持侦听 UDP 套接字的简洁方式?

    在 Rails 中 集成更新模型某些元素的 UDP 侦听过程的最佳方式是什么 特别是向其中一个表添加行 简单的答案似乎是在同一进程中使用 UDP 套接字对象启动一个线程 但不清楚我应该在哪里执行适合 Rails 方式的操作 有没有一种巧妙的
  • Rails 加载完成后运行代码?

    我有一个定期任务需要每分钟执行一次 使用delayed job 我希望 Rails 在加载完成后立即自动将其排队 如果系统中尚不存在此类任务 对于我来说 在整个 Rails 引导流程结束时运行一些代码的好地方是什么 有人建议 config
  • Capistrano 无法部署到远程服务器

    SOLUTION 解决方案是将以下内容添加到 production rb 的顶部 unshift File expand path lib ENV rvm path Add RVM s lib directory to the load p
  • Capistrano 部署:从独角兽开始

    使用 capistrano 进行部署 一切都很顺利 然后当部署 启动 在部署 冷期间 时 它会产生错误 32m2013 03 14 15 03 05 executing deploy start 0m 33mexecuting etc in
  • 查找所有具有重复名称的用户

    我有具有名字和姓氏字段的用户 我需要做一个 ruby 查找根据名字和姓氏具有重复帐户的所有用户 例如 我想要一个查找功能 可以搜索所有其他用户 并查找是否有任何用户具有相同的姓名和电子邮件 我在想像这样的嵌套循环 User all each
  • 我们可以从视图调用控制器的方法(理想情况下我们从助手调用)吗?

    在 Rails MVC 中 您可以从视图调用控制器的方法 因为方法可以从助手调用 如果是 怎么办 答案如下 class MyController lt ApplicationController def my method Lots of
  • 迁移范围的独特性

    我一直在尝试找到一种方法来实现这一目标 但我找不到任何尝试 即使如此 我想也许我的方法是完全错误的 也就是说 我应该做什么移民如果我希望两个字段的组合是唯一的 请注意 我不希望它们成为索引 而只是数据库字段 例如 对于下面的迁移 我可以单独
  • 如何在 Ruby on Rails 中读取远程文件的内容?

    这是我的文件 http example com test txt http example com test txt 我必须阅读以下内容http example com test txt http example com test txt
  • 计算列中连续真实值的数量

    假设我有一个数据框 如下所示 df pd DataFrame A 1 1 1 1 1 0 0 1 1 0 1 1 1 1 1 0 0 0 0 0 1 1 然后 我将其转换为布尔形式 df eq 1 Out 213 A 0 True 1 Tr
  • 迁移后删除轨道模型

    我觉得很奇怪 创建模型 运行迁移 销毁它 然后再次创建相同的模型会报告 SQL 异常 project master rails g model name name invoke active record create db migrate
  • 如何显示 pg-search 多重搜索结果的摘录

    我已经在 Heroku 上的 Rails 应用程序中设置了 pg search query fast PgSearch multisearch query gt
  • 在 Ruby/Rails 模型/控制器中引用关联/属性时 *、self.* 和 @* 之间的差异

    假设 Rails 模型具有持久 非持久属性 那么引用它们的最佳实践是什么 如果您查看公开可用的代码 就会发现使用了不同的模式 例如 如果您有从一个模型到另一个模型的关联 使用有什么区别self association name and 协会
  • rake db:migrate 和 rake db:create 都适用于测试数据库,而不是开发数据库

    我是 Stack Overflow 和 Ruby on Rails 的新手 我的问题是 当我运行命令 rake db create 或 rake db migrate 时 测试数据库受到影响 但开发数据库不受影响 导轨 3 2 2 我的数据

随机推荐