【问题标题】:saved_change_to_attribute? always returns false when called inside methodsaved_change_to_attribute?在方法内部调用时总是返回 false
【发布时间】:2020-02-25 10:47:46
【问题描述】:

所以我在ActiveRecord 模型中有一个after_update 回调来通知外部服务。只有在更新几个属性时才应该调用它。所以我将saved_change_to_attribute? 调用封装在一个方法中,然后在回调过滤器中使用:

after_update :tell_service!, if: :update_for_service?

def update_for_service?
  saved_change_to_name? ||
  saved_change_to_city? 
end

现在update_for_service? 总是返回false,我不明白为什么。

在控制台中:

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

这是怎么回事?

【问题讨论】:

  • 如果您将binding.pry 放入您的update_for_service? 会发生什么?
  • 您在此模型上是否还有其他可能会干扰的回调?我设置了一个与您相同的模型,它的工作方式完全符合您的预期。尝试从头开始制作模型或选择一个非常简单的模型并在该模型中尝试您的代码。代码肯定可以工作。
  • 有什么解决办法吗?我也面临同样的问题。

标签: ruby-on-rails activerecord ruby-on-rails-5


【解决方案1】:

这是由于after_update 在回调生命周期中运行的时间。 This answer by pan.goth 解释:

after_saveafter_createafter_update在事务块中被调用,所以它们会在执行SQL语句之前被执行。

如果你想在语句执行完成后做一些事情,你应该使用after_commit回调。

【讨论】:

  • 这通常是正确的 - 尽管我仍然有 saved_change_to_attribute? 在类似 OP 的方法中返回 false
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
相关资源
最近更新 更多