2016-03-21 60 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提供者模型並對其進行修改,以從該類而不是位置級別內行事。