我有一个在 MySQL 中使用 Rails 4 迁移创建的表:
| nba_average_stats | CREATE TABLE `nba_average_stats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ppg` decimal(2,0) DEFAULT '0',
`apg` decimal(2,0) DEFAULT '0',
`rpg` decimal(2,0) DEFAULT '0',
`tpm` decimal(2,0) DEFAULT '0',
`blk` decimal(2,0) DEFAULT '0',
`stl` decimal(2,0) DEFAULT '0',
`year` int(11) DEFAULT '0',
`player_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=414 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
我遇到的问题是当我做类似的事情时:
stat.ppg = 4.3; stat.save
它在数据库中显示为整数 4
我的数据库类型不对吗?我在 Rails 端做错了什么吗?
最佳答案
你会想要增加小数位:
https://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-characteristics.html
| nba_average_stats | CREATE TABLE `nba_average_stats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ppg` decimal(2,1) DEFAULT '0',
`apg` decimal(2,1) DEFAULT '0',
`rpg` decimal(2,1) DEFAULT '0',
`tpm` decimal(2,1) DEFAULT '0',
`blk` decimal(2,1) DEFAULT '0',
`stl` decimal(2,1) DEFAULT '0',
`year` int(11) DEFAULT '0',
`player_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=414 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
decimal
的第一个参数是精度,第二个参数是小数位数。精度包含小数位数,因此精度必须始终大于或等于小数位数。比例是小数点后的位数。要存储上面示例中的值 4.3
,您至少需要 decimal(2,1)
,这意味着最多 2 位数字,1 位在小数点后。
将其更改为 decimal(2,1)
将允许您将 4.3
存储为 4.3
而不是向下舍入为 4
。
由于您提到了 Rails 4 和迁移,您可以将精度和比例指定为迁移 DSL 中小数列类型的可选参数。例如:
add_column :nba_stats, :ppg, :decimal, :precision => 2, :scale => 1
http://guides.rubyonrails.org/active_record_migrations.html#column-modifiers
关于mysql - ActiveRecord 十进制类型字段截断为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21741703/