如何在destroy上跳过依赖模型中的回调

时间:2016-03-21 16:51:26

标签: ruby-on-rails

我有提供者和职位。当提供者被销毁时,我需要销毁任何职位。但是,当我尝试销毁提供程序时,check_primary中的position.rb方法崩溃了。

provider.rb

  has_many :positions, dependent: :destroy

position.rb

  after_destroy :check_primary

  def check_primary
    unless provider.primary_position # this shouldn't run when destroying a provider
      if provider.positions.present?
        provider.positions.first.update_column(:primary, true) # crash here
      end
    end
  end

提供商销毁时出错:无法更新销毁的记录

我的问题

我想在provider.rb中放置一个skip_callback,只要调用check_primary方法,就会在position.rb中跳过provider.destroy我该如何做到这一点?

使用:check_primary内的pry分析父对象时,我看到:

>> provider.destroyed?
=> false
>> provider.frozen?
=> false
>> provider.marked_for_destruction?
=> false

更新

我暂时无法理解这一点......所以这是一个非常糟糕的解决方法:

  def check_primary
    unless provider.primary_position
      begin
        provider.positions.first.update_column(:primary, true)
      rescue
        nil
      end
    end
  end

2 个答案:

答案 0 :(得分:1)

尝试在destroy的上下文中跳过它。在position.rb:

skip_callback :check_primary, on: destroy

编辑以解决我的误解。我对原来的非定论答案更有信心,但我相信你可以简单地通过以下条件:

skip_callback :check_primary, if: -> { #conditions }

答案 1 :(得分:0)

我相信Rails有一个回调:after_remove,在这种情况下会像(在Provider.rb中)一样使用 -

  has_many :positions, dependent: :destroy, after_remove: :check_primary

然后将check_primary移动到Provider模型中并将其修改为在该类中而不是Position类中进行操作。