DirtyAttributes采用更改的BigDecimal类型

时间:2015-06-02 12:56:09

标签: ruby-on-rails ruby-on-rails-4 activemodel

我在模型回调(after_save)中,其中一个属性是BigDecimal类型。因此,当我使用changes方法更改另一个属性并检查脏属性时,我有:

{"amount"=>[#<BigDecimal:7f86aa3ac900,'-0.4E3',9(18)>, #<BigDecimal:7f86aa3ac838,'-0.4E3',9(18)>], "description"=>["vvvv", "ccc"]}

它将数量实例化为BigDecimal,并将object_id作为更改的一部分。

有人知道如何避免这种行为吗?

1 个答案:

答案 0 :(得分:0)

如果在after_save中你需要检查一个特定的BigDecimal字段是否真的被改变了,你需要重新加载rails创建的方法attr_name_changed?(在你的情况下是amount_changed?):

 def amount_changed?
   if amount_change.present?
     amount_change[0].to_f != amount_change[1].to_f
   end
 end

它在浮动形式之前比较之前(amount_change[0])和之后(amount_change[1])的值。

然后在after_save回调中你可以这样做:

after_save :do_something_if_amount_changed

def do_something_if_amount_changed
  if amount_changed?
    do_something
  end
end