ruby-on-rails - DirtyAttributes 采用更改后的 BigDecimal 类型

标签 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"]}

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

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

最佳答案

如果在 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

关于ruby-on-rails - DirtyAttributes 采用更改后的 BigDecimal 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30596778/

相关文章:

ruby-on-rails - 根据与数组匹配的键对散列进行排序

ruby-on-rails - validate_uniqueness_of 可以与自定义范围一起使用吗?

ruby-on-rails - Ruby on Rails - 如何将哈希参数传递给部分 View ?

ruby-on-rails - Activerecord rails 合并多个选择结果并在 View 中呈现行

ruby-on-rails - Elastic Beanstalk Redis 失败,Web 应用程序无响应

ruby-on-rails-4 - 无法预编译 Assets Rails 4 bootstrap-sass DXImageTransform 错误

ruby-on-rails - 批量分配异常未找到解释(Rails 3.2.1)

ruby-on-rails - 如何测试自定义验证器?

javascript - 在 React 中使用外部脚本功能?

ruby-on-rails - 使用 Zeus 和 Sidekiq 进行 Rails 测试