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>
弃权警告:您试图分配的值不是 显式
true
或false
到布尔列。目前这个价值 施放到false
。这将改变以匹配Ruby的语义,并且会 在Rails 5中转换为true
。如果你想保持当前状态 行为,您应该显式处理您想要转换的值 到false
。
如果我将my_tinyint_col
的数据定义更改为tinyint(2)
问题就会消失 - 但有没有办法将tinyint(1)
视为使用ActiveRecord的数字?
答案 0 :(得分:3)
当tinyint(1)
被boolean
视为Hibernate
时,会出现同样的问题。诀窍不是使用tinyint(1)
而是使用tinyint(4)
。这样做, RoR 不会假设它是布尔值。
无论如何,tinyint(1)
中tinyint(2)
和MySQL
之间实际上没有区别。两者都可以保持相同的值 - 1和2只是column width
的指示符。
答案 1 :(得分:0)
对于通过Google搜索发现此问题的人:如果您遇到相同的问题,但又不想更改列数据类型,则可以将此行添加到模型中。
attribute :my_tinyint_col, ActiveRecord::Type::Integer.new
进一步阅读:https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html