【问题标题】:ActiveRecord decimal type field truncating to integerActiveRecord 十进制类型字段截断为整数
【发布时间】:2014-02-12 22:56:09
【问题描述】:

我有一个使用 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 端做错了吗?

【问题讨论】:

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


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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 愿意分享解决此问题的解决方案吗?我在迁移中使用了类似的东西:t.decimal :ppg, :precision => 2, :default => 0
      • 当然是的::scale => 1(在点之后有一个位置)。
      • @Jacek 请在答案中提供代码示例。您的评论不够全面,无法理解答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-07
      • 2017-06-20
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2016-04-22
      相关资源
      最近更新 更多