【问题标题】:Rails sees mysql tinyint(1) as a boolean - but I want it to be a numberRails 将 mysql tinyint(1) 视为布尔值 - 但我希望它是一个数字
【发布时间】:2017-02-19 15:03:45
【问题描述】:

Rails 4.2.1 使用 mysql2 gem。 ActiveRecord 将数据类型为tinyint(1) 的mysql 列视为布尔值。但我想将它用作一个小数字 - 我想存储高达 100 的值,这对于 tinyint(1) 来说是可以的。当我尝试创建记录时,tinyint 列转换为 false,并且我收到了折旧警告:

> Foo.create(my_tinyint_col: 13)
  (0.2ms)  BEGIN
    SQL (0.5ms)  INSERT INTO `foos` (`my_tinyint_col`) VALUES (0)
  (107.3ms)  COMMIT
  => #<Foo ID: 519, my_tinyint_col: false> 

弃用警告:您尝试分配的值不是 将 truefalse 显式添加到布尔列。目前这个值 转换为false。这将改变以匹配 Ruby 的语义,并将 在 Rails 5 中转换为 true。如果你想保持当前 行为,您应该明确处理您想要转换的值 到false

如果我将 my_tinyint_col 的数据定义更改为 tinyint(2),问题就会消失 - 但是有没有办法使用 ActiveRecord 将 tinyint(1) 视为数字?

【问题讨论】:

  • 为什么要对每个字节大惊小怪?你有多少亿条记录?

标签: mysql ruby-on-rails activerecord


【解决方案1】:

tinyint(1)Hibernate 视为boolean 时,也会出现同样的问题。诀窍不是使用tinyint(1),而是使用tinyint(4)。这样做,RoR 不会假定它是布尔值。

无论如何,MySQL 中的tinyint(1)tinyint(2) 实际上没有区别。两者可以保持相同的值 - 1 和 2 仅是 column width 的符号。

See this please

【讨论】:

    【解决方案2】:

    对于通过谷歌搜索发现此问题的人:如果您有同样的问题但不想实际更改列数据类型,您可以将此行添加到您的模型中。

    attribute :my_tinyint_col, ActiveRecord::Type::Integer.new
    

    延伸阅读:https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-30
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2022-08-05
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多