我有一个从Active Record返回的属性是一个大十进制。数据库列的数据是数字(18,0),我无权更改它。我希望能够将属性转换为没有小数精度的整数,但我没有运气。我知道我可以使用big_decimal.to_i将值转换为其他值,但我希望有一种方法可以在Active Record Model中处理这个问题,可能是after_initialize,这样我就不必担心我在其他地方的转换了。码。任何帮助将不胜感激,谢谢。
答案 0 :(得分:2)
如果您坚持使用旧架构,可以通过添加包装器方法来解决这个问题:
class MyModel < ActiveRecord::Base
def int_column
value = read_attribute(:big_decimal)
# Preserve `nil` values and avoid converting to zero.
value and value.to_i
end
def int_column=(value)
write_attribute(:big_decimal, value)
end
end
这为您提供了一种使用备用名称从该列读取/写入的方法。
答案 1 :(得分:0)
您始终可以为当前方法设置别名,然后覆盖它。
假设属性是充电
class Transaction < ActiveRecord::Base
# right now #charge returns #<BigDecimal:7fb6c285fe28,'0.0',9(18)>
# now we can alias the current method #charge
alias_method :big_decimal_charge, :charge
# now they both return #<BigDecimal:7fb6c285fe28,'0.0',9(18)>
# and we can redefine #charge, based on the alias
def charge
big_decimal_charge.to_i
end
end
我不认为有必要改变设定者。