2

mysql でスケール/有効桁数が 4 の 10 進数フィールドを定義しました (例: 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 BigDecimalROUND_*クラスのドキュメントの定数名を参照してください。

于 2011-02-17T08:33:25.783 に答える