我在mysql中定义了一个十进制字段,其缩放/有效数字为4(例如10.0001)。 ActiveRecord将其作为BigDecimal返回。
我可以在ActiveRecord中设置比例为5的字段(例如10.00001),然后保存它,这会有效地截断该值(它存储为10.0000)。
有没有办法防止这种情况发生?如果有办法强制扩展,我已经查看了BigDecimal类。找不到一个。我可以计算BigDecimal的比例并返回验证错误,但我想知道是否有更好的方法来强制执行它。
答案 0 :(得分: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_*
常量名称。