activerecord列类型/ before_validation

时间:2010-11-07 21:14:42

标签: ruby-on-rails activerecord callback

如何在活动记录将属性转换为相关列类型之前在模型级别按摩属性?

我的具体问题是这个......用户输入十进制形式的金额(即15.32美元)作为一个名为'美分'的整数类型列...在我的模型中,我尝试使用before_validation钩子来抓取该金额并将其转换为美分(应为1532),但是活动记录已将其四舍五入为整数,现在我的转换率仅为1500.

我可以在控制器级别转换参数中的金额,但我宁愿在模型中控制它以保持DRY。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我建议您根本不要公开cents属性。使用名为dollars的属性getter / setter对,并从中计算cents

class Model < ActiveRecord::Base
   …
   def dollars
     cents / 100.0
   end

   def dollars=(value)
     cents = dollars * 100
   end
   …
end

答案 1 :(得分:1)

您可以使用before_validation挂钩和before_type_cast值。你可以这样做:

class Model < ActiveRecord::Base
   before_validation :convert_dollars_to_cents

   def convert_dollars_to_cents
       cents = cents_before_type_cast * 100
   end
   …
end

我认为值得一提的是,因为许多人不了解before_type_cast值,但从对象建模的角度来看,这里的其他一些建议有很多可以提供。

答案 2 :(得分:0)

我不知道人们用什么来管理钱,但是我使用了rails_money插件,它会处理大部分的转换,所以我会先检查一下。

http://www.railslodge.com/plugins/461-rails-money

但是要解决您的问题,您希望将money属性存储为列类型的floatdecimal

我见过大多数人做过这样的事情。

t.decimal :amount, :precisions => 8, :scale => 2
相关问题