外部キー制約ついているデータの削除

# 外部キー制約がついているデータの削除について

外部キー制約がついているデータを削除するために必要なことを簡単にまとめました。
外部キー制約がなければ、destroyアクションで削除機能を実装する事ができますが、外部キー制約があると削除を実行するとエラーが出てしまします。

## エラーが出た時のコード
```Ruby:app> models> user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  with_options presence: true do
    validates :name
    validates :profile
    validates :occupation
    validates :position
  end

  has_many :prototypes
  has_many :comments
end
```
```Ruby:app> models> prototype.rb
class Prototype < ApplicationRecord
  with_options presence: true do
    validates :title
    validates :catch_copy
    validates :concept
    validates :image
  end

  belongs_to :user
  has_one_attached :image
  has_many :comments
end
```

# 修正した手順

## テーブル設計を確認する

```Ruby:README
## usersテーブル

| Column             | Type   | Options                   |
| ------------------ | ------ | ------------------------- |
| email              | string | null: false, unique: true |
| encrypted_password | string | null: false               |
| name               | string | null: false               |
| profile            | text   | null: false               |
| occupation         | text   | null: false               |
| position           | text   | null: false               |

### Association
- has_many :prototypes
- has_many :comments

## prototypesテーブル

| Column      | Type       | Options                        |
| ----------- | ---------- | ------------------------------ |
| title       | string     | null: false                    |
| catch_copy  | text       | null: false                    |
| concept     | text       | null: false                    |
| user        | references | null: false, foreign_key: true |　　←外部キー制約

### Association
- belongs_to :user
- has_many :comments

## commentsテーブル

| Column     | Type       | Options                        |
| ---------- | ---------- | ------------------------------ |
| content    | text       | null: false                    |
| prototype  | references | null: false, foreign_key: true |　　←外部キー制約
| user       | references | null: false, foreign_key: true |　　←外部キー制約

### Association
- belongs_to :user
- belongs_to :prototype
```

以上から、３箇所の外部キー制約が確認できます。
次の記述を追記すると削除が可能になります。

```Ruby:該当するカラム名に設定する
dependent: :destroy
```

## 各モデルの修正

```Ruby:app> models> user.rb
class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  with_options presence: true do
    validates :name
    validates :profile
    validates :occupation
    validates :position
  end

  has_many :prototypes, dependent: :destroy
  has_many :comments, dependent: :destroy
end
```

```Ruby:app> models> prototype.rb
class Prototype < ApplicationRecord
  with_options presence: true do
    validates :title
    validates :catch_copy
    validates :concept
    validates :image
  end

  belongs_to :user
  has_one_attached :image
  has_many :comments, dependent: :destroy
end
```

## 修正した結果

修正前に出ていたエラーが解消されて、削除したいデータが削除されました。
何故その記述が必要なのか、何処を修正するのかは検索しながらの手探り状態ではありますが、プログラムなのでルールさえわかれば少しずつでも理解していけます。
さらに深掘りたい方は、詳細に記載されている方のブログを探してみてください。