ActiveRecord :: Dirty attributed_changed?是正确的,即使属性没有更改

时间:2018-08-08 16:21:15

标签: ruby-on-rails rails-activerecord

我有一个有趣的问题,我的模型的status枚举属性的行为很奇怪。

我尚未更新status,但是:

(byebug) status_changed?
true
(byebug) status_change
["submitted_for_review", "submitted_for_review"]

这发生在我的控制器调用以下内容时:

@order.update {"recalculate"=>"true"}

由于错误的status_changed?,触发了以下回调:

before_save :run_status_callbacks, if: :status_changed?

在其中运行我的debugger语句,然后在第一块中运行命令。


为什么status属性即使未被触摸也被检测为已更改?

1 个答案:

答案 0 :(得分:1)

我在调试几个小时后发现了问题。这是一行:

validate :can_confirm_order?, if: :status_will_change!

它运行验证,但是有人写了:status_changed?而不是有条件的:status_will_change!

这很难找到,因为它位于验证规则中,说实话,在模型中验证了几十条验证规则之后,您就可以浏览所有这些规则。

自我注意:在代码审查期间要多加注意。