Rails Active Record:' attribute_before_last_save' vs' attribute_was'

时间:2018-02-04 17:05:36

标签: ruby-on-rails activerecord

所以我正在调试我facing的问题而且我很难理解为什么attribute_before_last_saveattribute_was的工作方式不同,因为docs我能得到的只是attribute_before_last_save { {1}}的行为与attribute_was类似,但在我的情况下,我获得nil一个而另一个获得正确值。

3 个答案:

答案 0 :(得分:2)

在Rails 5.1.4中查看attribute_was的来源时,您会找到这一行

emit_warning_if_needed("attribute_was", "attribute_before_last_save")

根据source code,它会引发以下弃用错误

  

回调后的attribute_was内部的行为将会发生                 在下一个版本的Rails中进行更改。新的返回值将反映出来                 在save返回后调用方法的行为(例如与之相反的行为)                 它现在返回)。要保持当前行为,请使用attribute_before_last_save                 代替。

答案 1 :(得分:1)

  

attribute_before_last_save(attr_name):返回上次保存前属性的原始值。   行为与attribute_was类似。此方法在之后非常有用   回调以在保存之前获取属性的原始值   刚刚发生的

回调后 受其影响

假设用户模型具有name属性:

class User < ApplicationRecord
  after_update :find_name_before_last_save

  def find_name_before_last_save
    puts "+++++++++++++++"
    puts name_before_last_save
  end
end

答案 2 :(得分:1)

attibute_before_last_save仅在将数据成功保存到db后起作用。

如果保存前有回调,则应使用attibute_was