次の 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)
、支払いは有効になります。
この煩わしさを取り除くセッターを書くことができます:
def amount=(val)
@amount = val.round(2)
end
...しかし、異なるモデルで同じセッターをたくさん書くのは面倒です。
Decimal
システム全体で、すべてのプロパティに対して同じ賢明なルールでこれを処理したいと思います。つまり、自分のスケールを知っているので、保存する前にそのスケールに丸めます。
これは、構成オプションまたは初期化子で処理できるものですか?