Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 销毁子对象的回调保存父对象的依赖关系后,在销毁父对象时会导致问题_Ruby On Rails_Ruby_Rails Activerecord - Fatal编程技术网

Ruby on rails 销毁子对象的回调保存父对象的依赖关系后,在销毁父对象时会导致问题

Ruby on rails 销毁子对象的回调保存父对象的依赖关系后,在销毁父对象时会导致问题,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,在这种情况下,我希望在另一个对象被销毁后更新父对象的依赖项。下面是类层次结构的一个示例: class Parent < ActiveRecord::Base has_one :info, :dependent => :destroy has_many :conditions, :dependent => :destroy .... end class Info < ActiveRecord::Base belongs_to :parent def

在这种情况下,我希望在另一个对象被销毁后更新父对象的依赖项。下面是类层次结构的一个示例:

class Parent < ActiveRecord::Base
  has_one  :info, :dependent => :destroy
  has_many :conditions, :dependent => :destroy
  ....
end

class Info < ActiveRecord::Base
  belongs_to :parent

  def recalculate
    # Do stuff
  end
  ....
end

class Condition < ActiveRecord::Base
  belongs_to :parent
  has_one :condition_detail

  after_destroy :update_info

  def update_info
    parent.info.recalculate
    parent.info.save(:validate => false)
  end
  ....
end
类父级:destroy
有许多:条件,:依赖=>:破坏
....
结束
类信息false)
结束
....
结束
问题是,当父对象被销毁时,它会销毁条件,然后启动after_destroy回调,并在信息对象被销毁后保存它。因此,在父对象被销毁后,信息仍然存在。如果我不绕过验证,保存将自动失败,这是我不希望看到的。使用save!引发了一个异常

条件上的回调必须是after_destroy,因为否则Info上的重新计算方法将无法正确表示关系的状态,无法计算它需要的内容

我觉得我需要一种方法在父级被破坏时绕过回调,但我认为这是不可能的。我不能使用dependent=>delete_-all,因为这不会破坏条件的子项。我试着看看是否有一种方法可以判断父级是否调用了destroy,并使用该信息绕过after_destroy中的保存,但这似乎也不起作用


任何帮助都将不胜感激,谢谢

我看到有两种选择:

  • 不要在条件下使用销毁后的
    回调,而是希望销毁条件的人重新计算信息。这是最干净的,因为您分离了两种不同的意图:对象销毁和计算。您可以看到,如果有一天您希望同时销毁两个条件,并且仅在两个条件都销毁后重新计算,那么这将更有帮助。您不能使用回调来执行此操作。它还与调用
    信息的
    条件.destroy
    的调用方更紧密地对齐。重新计算
    优于调用
    父.info.recompute的条件

    如果您确实想将此行为打包到条件中,请创建一个调用的
    #destroy#u and#u recommulate
    函数,而不仅仅是带有某种隐藏回调的
    #destroy
    。打电话的人更清楚的是,你将开始重新计算

  • 删除父对象的
    :dependent=>销毁
    :条件关联,并在
    父对象的
    回调之前将其替换为您自己的
    ,该回调将导致在没有回调的情况下销毁
    条件

    在Condition中,我会创建这个方法,比如说,
    #destroy_而不使用_回调
    ,并在其中
    destroy
    Condition的子项,然后使Condition
    删除
    本身

  • :dependent=>destroy
    的功能非常强大,但是对于这样的循环,我认为目前为止最清晰的方法是通过去掉一些魔法并更明确地管理对象和流程生命周期,使您所做的事情非常明确