我的销毁操作抛出此错误:
Failure/Error: Deal.delete(params[:id])
ActiveRecord::InvalidForeignKey:
PG::ForeignKeyViolation: ERROR: update or delete on table "deals" violates foreign key constraint "fk_rails_cc6e075aca" on table "origin_airports"
动作:
def destroy
Deal.delete(params[:id])
redirect_to deals_path
end
我找到了有关此问题的答案(例如this one),并因此调整了我的Deal
类:
has_many :origin_airports, dependent: :destroy
has_many :origins, through: :origin_airports, source: :airport
但是我仍然遇到相同的错误。
PS。上面提到的帖子的指定答案说:“尊重数据完整性的更好选择是在数据库级别设置CASCADE DELETE。”我很想知道怎么做。
谢谢。
答案 0 :(得分:1)
您应该检索对象,然后在其上调用destroy
,而不要使用delete(id)
的类方法
所以尝试一下:
deal = Deal.find(params[:id])
deal.destroy
答案 1 :(得分:1)
您可以将:dependent
选项设置为:
:destroy
当对象被销毁时,将在与其相关的对象上调用#destroy。
:delete
,当对象被销毁时,所有与其关联的对象将直接从数据库中删除,而无需调用它们的#destroy方法。
根据您的设置,您必须执行deal.destroy
而不是deal.delete
。
您也可以尝试(迁移):
def change
remove_foreign_key "model1", "model2"
add_foreign_key "model1", "mnodel2", on_delete: :cascade
end
没有数据丢失,因为它们只是索引。