Ruby on rails DirtyAttributes采用已更改的BigDecimal类型

Ruby on rails DirtyAttributes采用已更改的BigDecimal类型,ruby-on-rails,ruby-on-rails-4,activemodel,Ruby On Rails,Ruby On Rails 4,Activemodel,我在一个模型回调中(保存后),其中一个属性是BigDecimal类型。因此,当我更改另一个属性并使用changes方法检查脏属性时,我有如下方法: {"amount"=>[#<BigDecimal:7f86aa3ac900,'-0.4E3',9(18)>, #<BigDecimal:7f86aa3ac838,'-0.4E3',9(18)>], "description"=>["vvvv", "ccc"]} {“金额”=>[#,#],“说明”=>[“VVV”,

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

{"amount"=>[#<BigDecimal:7f86aa3ac900,'-0.4E3',9(18)>, #<BigDecimal:7f86aa3ac838,'-0.4E3',9(18)>], "description"=>["vvvv", "ccc"]}
{“金额”=>[#,#],“说明”=>[“VVV”,“ccc”]}
它将amount实例化为BigDecimal,并将object_id作为更改的一部分


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

如果在保存后需要检查特定的BigDecimal字段是否真的发生了更改,则需要重新加载rails创建的方法
attr\u name\u changed?
(在您的情况下
amount\u changed?
):

它以浮点形式比较(
amount\u change[0]
)之前和之后(
amount\u change[1]
)的值

因此,在保存回调后,您可以执行以下操作:

after_save :do_something_if_amount_changed

def do_something_if_amount_changed
  if amount_changed?
    do_something
  end
end
after_save :do_something_if_amount_changed

def do_something_if_amount_changed
  if amount_changed?
    do_something
  end
end