我有提供者和职位。当提供者被销毁时,我需要销毁任何职位。但是,当我尝试销毁提供程序时,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
答案 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类中进行操作。