同时避免 `: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 个选项,cascade
和 restrict
(通常是默认值)。
你可以试试before_destroy
在回答模型
before_destroy :detach_associated
def detach_associated
self.answer_likes.update_all(:answer_id => nil)
end
在这种情况下,相关记录不会被删除,但会被孤立。
嗯,我不知道这对于大量关联记录的效率如何
我了解当我的模型中有关联时,我需要在关联中添加一个 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 个选项,cascade
和 restrict
(通常是默认值)。
你可以试试before_destroy
在回答模型
before_destroy :detach_associated
def detach_associated
self.answer_likes.update_all(:answer_id => nil)
end
在这种情况下,相关记录不会被删除,但会被孤立。
嗯,我不知道这对于大量关联记录的效率如何