ActiveRecord十进制类型字段截断为整数

时间:2014-02-12 22:56:09

标签: mysql ruby-on-rails activerecord ruby-on-rails-4

我有一个使用Rails 4迁移在MySQL中创建的表:

| 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端做错了吗?

2 个答案:

答案 0 :(得分:1)

您可能希望增加小数的比例:

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的第一个参数是精度,第二个参数是比例。精度包括比例,因此精度必须始终大于或等于比例。 Scale是小数点后的位数。要存储上述示例中的值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

答案 1 :(得分:0)

decimal(2,0)表示您只能存储整数。