rails 3.2:在销毁元素时也调用after_update?

时间:2012-02-14 08:03:23

标签: ruby-on-rails ruby-on-rails-3 callback

我们有小班,有相关的班级

class Car
  has_one :engine, :dependent => :destroy

  after_update :save_engine


  delegate :oil_level, :oil_level=, :to => :engine

  def save_engine
    engine.save if engine
  end
end

正如您所知,我们正在努力解决孩子未自动保存在rails中的问题。因此,我们可以在汽车上设置oil_level,并在保存时将其正确存储在engine

现在当我们试图删除汽车时会发生什么?显然,engine永远不会被删除,这是由after_update引起的,它将重新保存刚刚删除的引擎。因此汽车被成功删除,但引擎被重新创建(一个新的id),并且不再与汽车相关联。我希望正确删除引擎。

我找到了一个可靠的解决办法:

class Car
  has_one :engine, :dependent => :destroy

  after_update :save_engine
  before_destroy :set_destroying


  delegate :oil_level, :oil_level=, :to => :engine

  def set_destroying
    @destroying = true
  end

  def save_engine
    engine.save if engine && !@destroying
  end
end

但它仍然感觉有点脏,就像应该有更好的方法来做到这一点。 在销毁时调用after_update似乎有点不合逻辑。 是否有特定的轨道方式来了解回调中实际进行的操作(保存/创建/销毁)?。

简而言之:处理此问题的正确方法是什么?或者这实际上是某种rails-bug?或者这是预期的行为吗?

2 个答案:

答案 0 :(得分:1)

一段时间没有完成Rails,所以我可能会偏离主题,但您是否考虑过使用:autosave选项?

答案 1 :(得分:0)

1)确保在car_controller中def销毁调用car.destroy NOT car.delete,否则将错过回调并且不会销毁引擎。

2)引擎未被删除(相同的ID)还是被重新创建? (diff id),你似乎在你的描述中从一个跳到另一个。

相关问题