Rails 将 mysql tinyint(1) 视为布尔值 - 但我希望它是一个数字

jos*_*eir 4 mysql activerecord ruby-on-rails

Rails 4.2.1 使用 mysql2 gem。ActiveRecord 将数据类型为布尔值的 mysql 列视为tinyint(1)布尔值。但我想将它用作一个小数字 - 我想存储最多 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> 
Run Code Online (Sandbox Code Playgroud)

弃用警告:您尝试分配一个未显式的值truefalse分配给布尔列。目前该值转换为false. 这将更改以匹配 Ruby 的语义,并将在 Rails 5 中强制转换为true。如果您想维持当前行为,则应该显式处理您想要强制转换为的值false

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

Mon*_*hon 5

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

无论如何,tinyint(1)tinyint(2)in实际上没有什么区别MySQL。两者可以持有相同的值 - 1 和 2 是column widthonly 的能指。

请看这个