私はRailsとPostgreSQLで作業しており、基本的な1対多の関係が進行しています。1つのAuction
には多くのBid
sがあります。オークション(入札が存在する)を削除すると、次のエラーが表示されます。
エラー:テーブル「auctions」の更新または削除は、テーブル「bids」の外部キー制約「fk_Rails_43e9021cbf」に違反しています。詳細:Key(id)=(1)は、まだテーブル "bids"から参照されています。
入札なしでオークションを削除してもエラーは発生しません。
私を混乱させる部分は、私のAuction
モデルの内部にある:
has_many :bids, dependent: :destroy
依存するdestroy句があるのに、なぜこのエラーが表示されるのですか?
編集: DB全体をドロップしてから、すべてを再作成/再移行しようとしました-それでも同じエラーが発生します。
私の問題は、@auction.delete
(投稿したスクリーンショットに表示)レコードを削除しようとしたとき。
削除は、私が持っているコールバックを無視します。依存するdestroy句がありますが、呼び出されていません-したがってRailsはエラーをスローします。コードを変更して@auction.destroy
、コールバックが呼び出され、問題が解決しました。
参照: 破棄と削除の違い
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
delete
またはdestroy
を使用してオブジェクトを削除していますか? delete
を使用していて、destroy
を使用したいと思う
偶然 paranoia gemまたはそれに似たものを使用していますか?
bids
がparanoid
であり、auctions
がそうでない場合、このエラーが発生する可能性があります。
これは、Railsがdependent: destroy
、入札はソフト削除されますが、実際にはまだDBに存在します(deleted_at
列セット)。したがって、外部キー制約は失敗します。
あなたのエラーはRailsではなくデータベースからのものです。最初にアプリで入札を削除するか、dbの外部キー制約を変更して削除をカスケードする必要があります
MarcBusquéは 非常に良い記事 この問題について助けになるかもしれません。
「ActiveRecordが外部キー違反に遭遇すると、ActiveRecord :: InvalidForeignKey例外が発生します。ドキュメントに、存在しないレコードを参照しているためにレコードを挿入または更新できないときに発生するというだけでも、事実は興味のある場合にも使用されます。」
それとrescue_fromを使用して、ApplicationControllerまたはコントローラーの懸念事項に追加するだけです。
rescue_from 'ActiveRecord::InvalidForeignKey' do
# Flash and render, render API json error... whatever
end