2016-03-21 10 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 

プロバイダのエラーは破棄:が破壊されたレコードを更新することはできません

私の質問

私は provider.destroyメソッドが呼び出されるたびに position.rbcheck_primaryスキップ provider.rbにskip_callbackを入れたいと思い

どうすればいいですか?

: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

destroyのコンテキストでスキップしてください。 position.rbで:

skip_callback :check_primary, on: destroy 

私の誤解を解決するために編集してください。私は、私のオリジナルでオフポイントの答えを、より自信を持っていたが、私は次のようにあなたは、単にそれを条件に渡すことができると信じて:after_remove、この場合に使用されるだろう:私はRailsは、このためのコールバックを持っていると信じて

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

申し訳ありません背景:ユーザーがプライマリを削除した場合にプライマリポジションが割り当てられるようにポジションを破棄する場合は、このメソッドを呼び出します。 – Abram

+0

ああ - 私はafter_destroyを見ています。私はもっ​​と慎重に読む必要があった。 – toddmetheny

+0

他人を助けるかもしれないので、あなたの答えを残してください。ありがとう。 – Abram

0

を(Provider.rb中)のような - そして

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

とプロバイダー・モデルにcheck_primaryを移動し、そのクラスではなく、ポジションのクラスの中から行動するように変更します。

関連する問題