依赖:: destroy - 这是如何工作的?

时间:2014-01-04 00:55:43

标签: ruby-on-rails database-design dependencies associations

在一个示例中,所有者与作为伙伴的关联:

class Owner < ActiveRecord::Base
  has_many :buildings, dependent: :destroy 
end

关系的另一面:

class Building < ActiveRecord::Base
  belongs_to :owner
end

如果我要删除所有者,它是否会破坏相关的建筑物?如何删除所有者,如何指定依赖关系,以便所有者和主键不再与任何建筑物相关联?

2 个答案:

答案 0 :(得分:7)

你可能想要:nullify。请参阅has_many的Rails文档。

:dependent控制关联对象在其所有者被销毁时会发生什么。请注意,这些是作为回调实现的,Rails按顺序执行回调。因此,其他类似的回调可能会影响:依赖行为,并且:依赖行为可能会影响其他回调。

:destroy导致所有相关对象也被销毁。

:delete_all导致所有关联对象直接从数据库中删除(因此不会执行回调)。

:nullify会将外键设置为NULL。回调不会被执行。

如果有任何关联记录,

:restrict_with_exception会引发异常。

如果有任何关联对象,

:restrict_with_error会将错误添加到所有者。

如果使用:through选项,则连接模型上的关联必须是belongs_to,并且删除的记录是连接记录,而不是关联的记录。

答案 1 :(得分:1)

  1. 是的,它会将关联的建筑物删除为指定的从属:destroy
  2. 如果您想保留建筑物记录,我建议您使用连接表,以便在删除所有者时,仅删除连接表中的记录。