web-dev-qa-db-ja.com

エラー:テーブルでの削除は外部キー制約に違反しています。キーIDはまだテーブルから参照されています(多く)

私はRailsとPostgreSQLで作業しており、基本的な1対多の関係が進行しています。1つのAuctionには多くのBidsがあります。オークション(入札が存在する)を削除すると、次のエラーが表示されます。

エラー:テーブル「auctions」の更新または削除は、テーブル「bids」の外部キー制約「fk_Rails_43e9021cbf」に違反しています。詳細:Key(id)=(1)は、まだテーブル "bids"から参照されています。

入札なしでオークションを削除してもエラーは発生しません。

私を混乱させる部分は、私のAuctionモデルの内部にある:

has_many :bids, dependent: :destroy

Error Screen Shot (better_error gem)

依存するdestroy句があるのに、なぜこのエラーが表示されるのですか?

編集: DB全体をドロップしてから、すべてを再作成/再移行しようとしました-それでも同じエラーが発生します。

40
SUPER USER

私の問題は、@auction.delete(投稿したスクリーンショットに表示)レコードを削除しようとしたとき。

削除は、私が持っているコールバックを無視します。依存するdestroy句がありますが、呼び出されていません-したがってRailsはエラーをスローします。コードを変更して@auction.destroy、コールバックが呼び出され、問題が解決しました。

参照: 破棄と削除の違い

13
SUPER USER

Rails v4.2からこれを行うことができます:

外部キーを更新する移行を作成します

20160321165946_update_foreign_key.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
34
Mohamed Ziata

deleteまたはdestroyを使用してオブジェクトを削除していますか? deleteを使用していて、destroyを使用したいと思う

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#module-ActiveRecord::Associations::ClassMethods-label-Delete+or+destroy-3F を参照してください

17
John Naegle

偶然 paranoia gemまたはそれに似たものを使用していますか?

bidsparanoidであり、auctionsがそうでない場合、このエラーが発生する可能性があります。

これは、Railsがdependent: destroy、入札はソフト削除されますが、実際にはまだDBに存在します(deleted_at列セット)。したがって、外部キー制約は失敗します。

8
steveklbnf

あなたのエラーはRailsではなくデータベースからのものです。最初にアプリで入札を削除するか、dbの外部キー制約を変更して削除をカスケードする必要があります

4
Tony Hopkinson

MarcBusquéは 非常に良い記事 この問題について助けになるかもしれません。

「ActiveRecordが外部キー違反に遭遇すると、ActiveRecord :: InvalidForeignKey例外が発生します。ドキュメントに、存在しないレコードを参照しているためにレコードを挿入または更新できないときに発生するというだけでも、事実は興味のある場合にも使用されます。」

それとrescue_fromを使用して、ApplicationControllerまたはコントローラーの懸念事項に追加するだけです。

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