同时避免 `:dependent => :destroy` 和 `ForeignKeyViolation: ERROR`

simultaneously avoiding a `:dependent => :destroy` and a `ForeignKeyViolation: ERROR`

我了解当我的模型中有关联时,我需要在关联中添加一个 dependent: destroy,例如:

answer.rb:

 has_many :answer_likes, :dependent => :destroy

以确保当一个对象(例如,一个答案)被删除时,所有关联的对象(answer_likes)也被删除。

这有助于避免此错误(或类似错误):

ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR:

另一方面,如果我不希望出现此错误,并且我不希望可能引用此已删除对象 (answer) 的关联对象 (answer_likes) 也被删除, 推荐的协会组织方式是什么?

谢谢。

如果您使用新的 Rails 4.2 foreign key 定义,那么您不需要使用 has_many 特别是如果您不需要访问主模型中的关联对象。

但是,如果您尝试删除具有关联对象的记录,默认情况下外键约束会引发错误。

您可以通过告诉数据库在删除的情况下应该做什么来避免错误,将正确的选项传递给 add_foreigh_key 调用。如果你通过

on_delete: :nullify

然后数据库将允许删除 Answer,并将每个 AnswerLike 的外键设置为 nil。还有其他 2 个选项,cascaderestrict(通常是默认值)。

你可以试试before_destroy

回答模型

before_destroy :detach_associated

def detach_associated
  self.answer_likes.update_all(:answer_id => nil)
end

在这种情况下,相关记录不会被删除,但会被孤立。

嗯,我不知道这对于大量关联记录的效率如何