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)、支払いは有効になります。

この煩わしさを取り除くセッターを書くことができます:

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

...しかし、異なるモデルで同じセッターをたくさん書くのは面倒です。

Decimalシステム全体で、すべてのプロパティに対して同じ賢明なルールでこれを処理したいと思います。つまり、自分のスケールを知っているので、保存する前にそのスケールに丸めます

これは、構成オプションまたは初期化子で処理できるものですか?

4

2 に答える 2

2

DataMapper のDecimalクラスにモンキー パッチを適用できます (オリジナルは at 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 に答える