gpt4 book ai didi

ruby-on-rails - Rails before_destroy 回调数据库更改总是回滚

转载 作者:行者123 更新时间:2023-11-29 12:20:39 25 4
gpt4 key购买 nike

我正在尝试防止从数据库中删除模型并且几乎遵循此 guide (请参阅 Rails 4 一书中的 9.2.5.3 用 before_destroy 锻炼你的偏执狂)。

我有一个简单的模型:

class User < ActiveRecord::Base
before_destroy do
update_attribute(:deleted_at, Time.current)
false
end

在 Controller 中:

def destroy
@user = User.find(params[:id])
# @user.update!(deleted_at: Time.zone.now) # if I do it here it works
@user.destroy # if I also comment this line...

render :show
end

回调被调用并且属性被设置,但是随后数据库事务总是被回滚。如果我没有返回 false,模型将被删除,因为 delete 的执行没有停止。

正如您在评论中看到的那样,我可以让它工作,但我真正想做的是使用服务对象并将逻辑放在 Controller 之外。

最佳答案

如果您的回调返回 false,事务将始终被回滚。

对于你想要的,你不应该在你的 arel 对象上调用 destroy 方法。
相反,创建您自己的方法,如 soft_destroy 或类似的方法并更新您的属性。

为了防止其他人在您的 arel 对象上调用 destroy 方法,只需添加一个回调引发和异常。

关于ruby-on-rails - Rails before_destroy 回调数据库更改总是回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26735907/

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