执行before_destroy后如果destroy失败,before_destroy操作会发生什么情况

问题描述 投票:0回答:1
class User
    before_destroy :some_operation

    private

    def some_operation
        # destroy operation
    end
end

在运行

user.destroy
时,它会销毁一些对象,并且稍后如果由于某些验证检查而销毁失败,则
before_destroy
操作会回滚(由 Rails 作为一个事务处理)?如果没有,关于如何处理此类情况有什么建议或参考吗?

ruby-on-rails callback lifecycle
1个回答
0
投票

数据库修改由 Rails 处理:

#save、#save! 或 #destroy 调用的整个回调链在事务中运行。这包括 after_* 挂钩。如果一切顺利,一旦链完成,就会执行 COMMIT。

如果 before_* 回调取消了操作,则会发出 ROLLBACK。您还可以触发 ROLLBACK 在任何回调中引发异常,包括 after_* 挂钩。但请注意,在这种情况下,客户端需要意识到这一点,因为普通的 #save 会引发此类异常,而不是悄悄返回 false。

https://api.rubyonrails.org/v7.0.7.2/classes/ActiveRecord/Callbacks.html

© www.soinside.com 2019 - 2024. All rights reserved.