2011-02-09 15 views
2

mysql(例:10.0001)の小数点以下桁数を4に設定しました。 ActiveRecordはそれをBigDecimalとして返します。BigDecimalの有効桁数を強制する方法

ActiveRecordのフィールドを5のスケール(例:10.00001)に設定して保存すると、効果的に値を切り捨て(10.0000として保存されます)できます。

これを防ぐ方法はありますか?スケールを強制する方法がある場合、私はすでにBigDecimalクラスを調べました。 1つを見つけることができませんでした。私はBigDecimalのスケールを計算し、検証エラーを返すことができますが、それを強化するためのより良い方法があるのだろうかと思います。

答えて

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_*

関連する問題