Ruby on rails 已保存\u是否将\u更改为\u属性?在方法内部调用时始终返回false

Ruby on rails 已保存\u是否将\u更改为\u属性?在方法内部调用时始终返回false,ruby-on-rails,activerecord,ruby-on-rails-5,Ruby On Rails,Activerecord,Ruby On Rails 5,因此,我在ActiveRecord模型中有一个after\u update回调来通知外部服务。只有在更新两个属性时才应调用此函数。因此,我将saved\u change\u to\u属性?调用封装在一个方法中,然后在回调过滤器中使用该方法: after_update :tell_service!, if: :update_for_service? def update_for_service? saved_change_to_name? || saved_change_to_city?

因此,我在
ActiveRecord
模型中有一个
after\u update
回调来通知外部服务。只有在更新两个属性时才应调用此函数。因此,我将
saved\u change\u to\u属性?
调用封装在一个方法中,然后在回调过滤器中使用该方法:

after_update :tell_service!, if: :update_for_service?

def update_for_service?
  saved_change_to_name? ||
  saved_change_to_city? 
end
现在
update\u for\u服务?
总是返回
false
,我不明白为什么

在控制台中:

> p = Person.last
> p.name = 'Tom'
> p.save
true
> p.saved_change_to_name?
true
> p.update_for_service?
false

这是怎么回事?

这是由于在回调生命周期中运行更新后的
造成的。说明:

在事务块中调用保存后的
,\u创建后的
,\u更新后的
,因此它们将在执行SQL语句之前执行

如果要在语句执行完成时执行某些操作,则应使用回调


如果将
绑定.pry
放在
update\u for\u服务中会发生什么情况?
?此型号上是否有其他可能会造成干扰的回调?我建立了一个和你一样的模型,它完全按照你的预期工作。尝试从头开始创建一个模型,或者选择一个非常简单的模型,然后在该模型中尝试您的代码。代码肯定会起作用。