我们有小班,有相关的班级
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?或者这是预期的行为吗?
答案 0 :(得分:1)
一段时间没有完成Rails,所以我可能会偏离主题,但您是否考虑过使用:autosave
选项?
答案 1 :(得分:0)
1)确保在car_controller中def销毁调用car.destroy NOT car.delete,否则将错过回调并且不会销毁引擎。
2)引擎未被删除(相同的ID)还是被重新创建? (diff id),你似乎在你的描述中从一个跳到另一个。