gpt4 book ai didi

ruby-on-rails - Rails 4 after_save previous_changes 不起作用

转载 作者:行者123 更新时间:2023-12-04 07:36:46 25 4
gpt4 key购买 nike

我在模型上有一个 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

所以更改将设置为 @previously_changed之后 changes_applied被调用,和 changes_apply打电话时 save被调用,意思是 AFTER DOING PERSISTENT WORK (第 42 行)

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

所以在你的回调中,你可以使用 record.changed_attributes , 外用 previously_changed ,它会工作得很好!

关于ruby-on-rails - Rails 4 after_save previous_changes 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35140457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com