U-Yuri’s 健忘録

U-Yuri’s 備忘録

プログラミングを勉強しています。アウトプットに活用しているブログです。

【Rails】外部キー制約の参照制約 (SQLite3::ConstraintException: FOREIGN KEY constraint failed)

はじめに

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ガイド

カスケード削除の例

Railsで外部キー制約の参照制約の書き方 #Ruby - Qiita