class User
before_destroy :some_operation
private
def some_operation
# destroy operation
end
end
在运行
user.destroy
时,它会销毁一些对象,并且稍后如果由于某些验证检查而销毁失败,则 before_destroy
操作会回滚(由 Rails 作为一个事务处理)?如果没有,关于如何处理此类情况有什么建议或参考吗?
数据库修改由 Rails 处理:
#save、#save! 或 #destroy 调用的整个回调链在事务中运行。这包括 after_* 挂钩。如果一切顺利,一旦链完成,就会执行 COMMIT。
如果 before_* 回调取消了操作,则会发出 ROLLBACK。您还可以触发 ROLLBACK 在任何回调中引发异常,包括 after_* 挂钩。但请注意,在这种情况下,客户端需要意识到这一点,因为普通的 #save 会引发此类异常,而不是悄悄返回 false。
https://api.rubyonrails.org/v7.0.7.2/classes/ActiveRecord/Callbacks.html