加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Rails 4 after_save previous_changes无效

发布时间:2020-12-17 02:49:03 所属栏目:百科 来源:网络整理
导读:我在模型上有一个after_save回调,我正在调用previous_changes来查看属性(is_complete)是否发生了变化.即使属性发生更改,previous_changes也会返回空哈希. 这是回调: after_save do |record| puts "********************" puts record.previous_changes.to_s
我在模型上有一个after_save回调,我正在调用previous_changes来查看属性(is_complete)是否发生了变化.即使属性发生更改,previous_changes也会返回空哈希.

这是回调:

after_save do |record|
  puts "********************"
  puts record.previous_changes.to_s
  puts record.is_complete
  puts "********************"
end

这是我在日志中得到的:

********************
{}
true
********************
********************
{}
false
********************

如果is_complete的值从true更改为false,则它应该在previous_changes哈希中.更新正在通过正常保存完成!而且我没有重新加载这个对象.

—更新—

我在发布问题时没有考虑过这个,但是我的模型使用了awesome_nested_set gem,看来这是重新加载对象或以某种方式干扰after_save回调.当我注释掉acts_as_nested_set时,回调似乎工作正常.

—更新2 —

使用around_save回调修复此问题,该回调首先确定属性是否已更改,然后生成,然后执行在数据库中进行更改后需要执行的操作.工作解决方案如下所示:

around_save do |record,block|
  is_complete_changed = true if record.is_complete_changed?
  block.call
  if is_complete_changed
    ** do stuff **
  end
end

解决方法

根据 ActiveModel::Dirty源代码

从第274行

def changes_applied # :doc:
    @previously_changed = changes
    @changed_attributes = ActiveSupport::HashWithIndifferentAccess.new
 end

因此,在调用changes_applied之后,更改将设置为@previously_changed,并且在调用save时调用changes_apply,这意味着在执行持续工作之后(第42行)

总之,previous_changes仅在记录实际保存到持久存储(DB)时具有值

所以在你的回调中,你可以使用record.changed_attributes,并且在使用previous_changed时,它会正常工作!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读