我可以将活动记录中的属性从大十进制转换为整数吗?

时间:2016-04-18 21:54:59

标签: ruby activerecord rails-activerecord

我有一个从Active Record返回的属性是一个大十进制。数据库列的数据是数字(18,0),我无权更改它。我希望能够将属性转换为没有小数精度的整数,但我没有运气。我知道我可以使用big_decimal.to_i将值转换为其他值,但我希望有一种方法可以在Active Record Model中处理这个问题,可能是after_initialize,这样我就不必担心我在其他地方的转换了。码。任何帮助将不胜感激,谢谢。

2 个答案:

答案 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

我不认为有必要改变设定者。