はじめに
delete機能を実装したが、デリートしたいテーブルを参照しているテーブルに影響が出るため「SQLite3::ConstraintException: FOREIGN KEY constraint failed」というエラーが出た。
そのため、まずは参照しているテーブルを削除する必要がある。
そこで辿り着いたのが外部キー制約の参照制約というものなので以下に残していく。
delete実装の為の各コード
controller.rb内
def deck_delete @deck = Deck.find(params[:id]) @deck.destroy end
index.html.erb内
<ul> <% @decks.each do |deck| %> <%= form_with url: deck_path(deck), method: :patch do |form|%> <%= link_to(deck) do %> <li><%= deck.name %></li> <% end %> <%= form.button "削除", formmethod: :delete, data:{ confirm: "Are you sure?" } %> <% end %> <% end %> </ul>
routes.rb内
delete "deck/:id", to: "pokeca#deck_delete"
手順
①マイグレーションファイル内にadd_foreign_key :card_in_decks, :decks, on_delete: :cascade
を追加。
class CreateCardInDecks < ActiveRecord::Migration[7.0] def change create_table :card_in_decks do |t| t.references :deck, foreign_key: true, null: false t.references :pokemon, foreign_key: true t.references :item, foreign_key: true t.references :support, foreign_key: true t.references :pokemon_no_item, foreign_key: true t.references :stajiamu, foreign_key: true t.references :energy, foreign_key: true t.timestamps end add_foreign_key :card_in_decks, :decks, on_delete: :cascade end end
②schema.rbを削除
③$ rails db:reset
④$ rails db:migrate
以上。
railsの設定もあるらしい→Active Record の関連付け - Railsガイド