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

时间:2016-10-11 05:32:25

标签: mysql ruby-on-rails activerecord

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)问题就会消失 - 但有没有办法将tinyint(1)视为使用ActiveRecord的数字?

2 个答案:

答案 0 :(得分:3)

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

无论如何,tinyint(1)tinyint(2)MySQL之间实际上没有区别。两者都可以保持相同的值 - 1和2只是column width的指示符。

See this please

答案 1 :(得分:0)

对于通过Google搜索发现此问题的人:如果您遇到相同的问题,但又不想更改列数据类型,则可以将此行添加到模型中。

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

进一步阅读:https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html