2

我在 mysql 中定义了一个比例/有效数字为 4 的十进制字段(例如 10.0001 )。ActiveRecord 将其作为 BigDecimal 返回。

我可以在 ActiveRecord 中以 5 的比例设置字段(例如 10.00001 ),然后保存它,这有效地截断了值(它存储为 10.0000)。

有没有办法防止这种情况?如果有强制缩放的方法,我已经看过 BigDecimal 类。找不到一个。我可以计算 BigDecimal 的比例并返回验证错误,但我想知道是否有更好的方法来执行它。

4

1 回答 1

1

您可以为您的类添加一个before_save处理程序并包含逻辑以根据您的喜好进行舍入,例如:

class MyRecord < ActiveRecord::Base
  SCALE = 4
  before_save :round_decimal_field
  def round_decimal_field
    self.decimal_field.round(SCALE, BigDecimal::ROUND_UP)
  end
end
r = MyRecord.new(:decimal_field => 10.00009)
r.save!
r.decimal_field # => 10.0001

甚至可以通过以某种方式读取模式来自动分配比例因子。

有关其他舍入模式,请参阅Ruby BigDecimal类文档ROUND_*中的常量名称。

于 2011-02-17T08:33:25.783 回答