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

时间:2015-09-16 11:29:59

标签: ruby-on-rails rails-activerecord model-associations

据我所知,当我的模型中有关联时,我需要在关联中添加dependent: destroy,例如:

answer.rb:

 has_many :answer_likes, :dependent => :destroy

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

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

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

另一方面,如果我不想要这个错误,并且我不希望可能引用此删除对象(回答)的关联对象(answer_likes)也被删除,那么是构建关联的推荐方法吗?

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

您可以通过告知数据库在删除时应该执行的操作来避免错误,并将正确的选项传递给add_foreigh_key调用。如果你通过

on_delete: :nullify

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

答案 1 :(得分:1)

您可以尝试before_destroy

答案模型

before_destroy :detach_associated

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

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

好吧,我不知道这对于大量相关记录的效率如何