如何在活动记录将属性转换为相关列类型之前在模型级别按摩属性?
我的具体问题是这个......用户输入十进制形式的金额(即15.32美元)作为一个名为'美分'的整数类型列...在我的模型中,我尝试使用before_validation钩子来抓取该金额并将其转换为美分(应为1532),但是活动记录已将其四舍五入为整数,现在我的转换率仅为1500.
我可以在控制器级别转换参数中的金额,但我宁愿在模型中控制它以保持DRY。
有什么建议吗?
答案 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属性存储为列类型的float
或decimal
。
我见过大多数人做过这样的事情。
t.decimal :amount, :precisions => 8, :scale => 2