Ruby on rails 错误:表上的删除违反外键约束。键id仍从表中引用(多个)

Ruby on rails 错误:表上的删除违反外键约束。键id仍从表中引用(多个),ruby-on-rails,postgresql,sublimetext2,better-errors-gem,Ruby On Rails,Postgresql,Sublimetext2,Better Errors Gem,我与Rails和PostgreSQL合作,有一个基本的一对多关系,一个拍卖有多个出价s。但是,当我尝试删除拍卖(存在出价)时,会出现以下错误: 错误:更新或删除表“拍卖”违反外键 表“bids”上的约束“fk_rails_43e9021cbf”。详细信息:键(id)=(1) 仍从表“投标”中引用 删除没有出价的拍卖不会产生错误 让我困惑的是,在我的拍卖模型中,我有: has_many :bids, dependent: :destroy 既然我有一个dependent destroy子句,为

我与Rails和PostgreSQL合作,有一个基本的一对多关系,一个
拍卖
有多个
出价
s。但是,当我尝试删除拍卖(存在出价)时,会出现以下错误:

错误:更新或删除表“拍卖”违反外键 表“bids”上的约束“fk_rails_43e9021cbf”。详细信息:键(id)=(1) 仍从表“投标”中引用

删除没有出价的拍卖不会产生错误

让我困惑的是,在我的
拍卖
模型中,我有:

has_many :bids, dependent: :destroy

既然我有一个dependent destroy子句,为什么我仍然得到这个错误


编辑:我已尝试删除整个数据库,然后重新创建/重新迁移所有内容-仍然会收到相同的错误。

您的错误来自数据库,而不是rails。您需要先在应用程序中删除出价,或更改db中的外键约束以级联删除

您是否使用
删除
销毁
来删除对象?我认为您正在使用
delete
并希望使用
destroy

参见

Marc Busque对这个问题的看法,这可能会有所帮助

“当ActiveRecord遇到外键冲突时,它会引发ActiveRecord::InvalidForeignKey异常。即使在其文档中它只是说,当记录引用不存在的记录而无法插入或更新时,会引发该异常,但事实上,它也会用于我们感兴趣的情况。”

有了这一点,再加上来自的救援,我们可以添加到ApplicationController或控制器关注点:

rescue_from 'ActiveRecord::InvalidForeignKey' do
  # Flash and render, render API json error... whatever
end

你是偶然使用宝石还是类似的东西

如果您是
bids
paranoid
auctions
不是,您可能会遇到此错误


这是因为当rails执行
dependent:destroy
时,它会软删除出价,但实际上它们仍然存在于DB中(它们只是在
列设置了
deleted\u)。因此,外键约束将失败。

我的问题是在尝试删除记录时使用了
@auction.delete
(在我发布的屏幕截图中可见)

Delete将忽略我的任何回调。因此,即使我有一个dependent destroy子句,也没有调用它——因此Rails抛出了一个错误。如果/当我将代码改为auction.destroy时,调用了回调并解决了问题

参考:

Rails v4.2可以执行以下操作:

创建迁移以更新外键

20160321165946\u更新\u外键.rb

class UpdateForeignKey < ActiveRecord::Migration
  def change
    # remove the old foreign_key
    remove_foreign_key :posts, :users

    # add the new foreign_key
    add_foreign_key :posts, :users, on_delete: :cascade
  end
end
class UpdateForeignKey
其他答案也不错,但不要提及有时您想保留从属记录,但要将外键置为空

class Post < ActiveRecord::Base
  has_many :comments, dependent: :nullify
end
class Post
请注意,这需要确保数据库表中的外键列为null:true


我不是肯定的,但您可能还需要将可选:true添加到从属模型中定义的属于关联中。

一个非常简单的解释:关联表至少包含一条与您试图销毁的表中的记录关联的记录

要解决此问题,请添加
dependent::destroy
(假设用户有许多帖子)


我尝试了“rake db:drop”,然后重新创建了数据库并重新运行了迁移文件。。。仍然得到相同的错误!如果里面有外键,那么只需将其删除并重新创建即可。你需要搜索脚本,看看它是否在那里,然后检查数据库本身。我也有这个问题,看到是数据库引发了错误,但是为什么rails不先删除依赖记录呢?OP和我有模型约束
dependent::destroy
。谢谢!切换到销毁而不是删除修复了问题!虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面更改页面未使用gems,则仅链接答案可能会无效,请参阅我的更新和解决方案/解释谢谢,我已修复了该错误。在初始引用创建迁移中,我将如何执行此操作?例如,我是否这样做:
ActiveRecord::Migration[5.0]def change add_reference:job_querys,:user,foreign_key:true,on_delete::cascade end
(从Rails 5.1.4的角度来看),我感觉到foreign_key是一个数据库级设置,而dependent::delete_all是一个模型级设置。如果我们在数据库中设置了一个外键(检查schema.rb),dependent::delete_all就不够了,我们还需要在数据库级别设置on_delete::cascade。我发现这篇文章很有帮助:。这是一个很好的修复,为我解决了这个问题。。。但是当我们告诉Rails通过
dependent::destroy
来清理数据库时,为什么我们必须求助于让数据库清理呢?我以前没有在其他代码库中看到过这种情况,但在我当前的代码库中,我不得不使用大量这样的代码!好地方!这就是我的问题!
has_many :post, dependent: :destroy