2

假设我有以下 DataMapper 模型:

class Payment
  include DataMapper::Resource

  property :id, Serial
  property :amount, Decimal, precision: 8, scale: 2
end

然后我执行以下操作:

p = Payment.new(:amount => 12.3245)

这笔付款将无效(至少在 DataMapper 1.2 中),说明Amount must be a number.

当然,数量一个数字(握拳);它的小数位数比酒店接受的要多。如果我这样做p.amount = p.amount.round(2),付款将有效。

可以写一个 setter 来消除这种烦恼:

def amount=(val)
  @amount = val.round(2)
end

...但是我很烦恼在不同的模型上编写一堆相同的设置器。

我更愿意在Decimal系统范围内对所有属性使用相同的、合理的规则来处理这个问题。即,由于您知道自己的比例,因此在保存之前四舍五入到该比例

这是否可以通过配置选项或初始化程序来处理?

4

2 回答 2

2

您可以修改 DataMapper 的Decimal类(原始位于dm-core-1.2.0/lib/dm-core/property/decimal.rb):

module DataMapper
  class Property
    class Decimal
      alias :original_typecast_to_primitive :typecast_to_primitive
      def typecast_to_primitive(value)
        typecasted = original_typecast_to_primitive(value)
        typecasted.round(@scale) if typecasted.respond_to?(:round)
      end
    end
  end
end

NiceDecimal或者您可以使用新行为定义您自己的属性类型。

于 2012-06-19T13:00:49.123 回答
0

您是否考虑过为每个比例类别编写自己的 DataMapper 数据类型?这样,就没有猴子补丁,您可以根据需要指定任意数量的案例,而不会在任何现有类中乱扔if/switch语句。DataMapper 对此有一个机制,请参阅属性文档的“可用类型”部分中的自定义数据类型列表。

于 2016-11-30T17:30:49.597 回答