1

amountデータベースに小数の列があるモデルがあります。BigDecimalこのモデルがインスタンス化されるときに、特定の精度でのみが与えられるようにしたいと思います。が提供されたときにシナリオをテストするための仕様を作成しました。Floatその後、が提供されてbefore_createいない場合にエラーを発生させるコールバックがありますBigDecimal

ただし、値がbefore_createコールバックに到達するまでに、Railsはすでに値をに変換していBigDecimalます。これは私が思っていた素晴らしいことであり、おそらくまだ精度をチェックできますが、レールがどのように変換されるか正確にはわからないので、チェーンのさらに上流で適切な引数タイプと精度をチェックするとよいでしょう。

これを行う方法はありますか?

4

2 に答える 2

1

http://api.rubyonrails.org/classes/ActiveRecord/Base.htmlから

列によって決定される型キャストを最初に実行することなく、生の属性データを読み取れるようにしたい場合があります。これは、すべての属性が持つ _before_type_cast アクセサーを使用して行うことができます。たとえば、アカウント モデルに残高属性がある場合、account.balance_before_type_cast または account.id_before_type_cast を呼び出すことができます。

于 2013-01-08T19:38:29.967 に答える
0

上書きしてみるamount=

def amount=(val)
  # checking / conversion goes here, new_val as result
  self[:amount] = new_val # don't use self.amount = new_val to avoid endless loop
end
于 2013-01-08T19:38:02.047 に答える