无法使用Object.delete(params [:id]

时间:2019-01-17 18:33:11

标签: ruby-on-rails ruby activerecord

我的销毁操作抛出此错误:

 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。”我很想知道怎么做。

谢谢。

2 个答案:

答案 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

没有数据丢失,因为它们只是索引。