2016-03-21 75 views
1

我有供应商和职位。当提供者被销毁时,我需要销毁任何职位。但是,当我尝试销毁提供者时,我的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 

上提供错误破坏:无法更新破坏记录

我的问题

我想提出一个skip_callback在provider.rb其中跳过check_primaryposition.rb每当provider.destroy方法被调用。 我该如何做到这一点?

当从:check_primary内分析与撬父对象我看到:

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

UPDATE

我不知道这一点现在...所以这里有一个非常糟糕的解决办法:

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

回答

1

尝试在销毁的情况下跳过它。在position.rb:

skip_callback :check_primary, on: destroy 

编辑解决我的误解。我在原来的有了更多的信心,关闭点的答案,但我相信你可以简单地通过它的条件如下:

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

对不起一些背景:我在销毁位置时调用此方法,以确保在用户删除主要位置时分配了主要位置。 – Abram

+0

啊 - 我现在看到了after_destroy。我需要更仔细地阅读。 – toddmetheny

+0

请留下您的答案,因为它可能会帮助其他人。谢谢。 – Abram

0

我认为Rails有这个回调:after_remove,在这种情况下将使用像(在Provider.rb) -

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

,然后移动到check_primary提供者模型并对其进行修改,以从该类而不是位置级别内行事。