【问题标题】:Rails before_destroy callback db changes always rolled backRails before_destroy 回调数据库更改总是回滚
【发布时间】:2014-11-04 13:06:19
【问题描述】:

我试图防止从数据库中删除模型,并且几乎遵循 Rails 4 书中的guide(请参阅 9.2.5.3 使用 before_destroy 锻炼你的妄想症)。

我有一个简单的模型:

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

在控制器中:

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 的返回,因为删除的执行没有停止,所以模型被删除了。

正如您在 cmets 中看到的,我可以让它工作,但我真正想做的是使用服务对象并将逻辑置于控制器之外。

【问题讨论】:

    标签: ruby-on-rails postgresql callback rails-activerecord activemodel


    【解决方案1】:

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

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

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

    【讨论】:

    • 我猜是 false 是原因。感谢您的确认。奇怪的是,它在一本书中提出。我会走你提议的路线。谢谢。
    【解决方案2】:

    您的模型只是一个对象。如果你真的想改变destroy的概念,那就改变它吧:

    def destroy
      condition ? alt_action : super
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多