私はプロバイダとポジションを持っています。プロバイダが破壊されたら、私は任意のポジションを破壊する必要があります。しかし、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.rb
に
check_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
申し訳ありません背景:ユーザーがプライマリを削除した場合にプライマリポジションが割り当てられるようにポジションを破棄する場合は、このメソッドを呼び出します。 – Abram
ああ - 私はafter_destroyを見ています。私はもっと慎重に読む必要があった。 – toddmetheny
他人を助けるかもしれないので、あなたの答えを残してください。ありがとう。 – Abram