プログラミング初心者の勉強メモ。

あくまでメモなので、自分が忘れそうなことだけちょこちょこ書いてます。

外部キー制約って何ですか?

削除機能追加時に出るエラー「foreign key」とは

Micropostを作るときに出てきた「外部キー制約」について。

説明がわかりにくかったので、具体例を挙げてメモしておくことにしました。

f:id:over54:20200718224156p:plain

外部キー制約(foreign_key)とは

「そのidを持つレコード(=dbでいう横列)が、参照先のテーブルに存在することを保証する制約」のこと。

具体例

f:id:over54:20200719001645p:plain

4行目。5行目にforeign_key:trueとありますが、これが「外部キー制約」です。

4行目のコードのみに絞って話を進めると、

作られたfavoritesテーブルには、 "user_id" というuserテーブルのidレコードへの外部キー制約がつけられています。

つまりfavoritesテーブルにuser_id = 1というレコードがある場合、userテーブルにもid = 1のレコードが存在しなければならないという制約がつけられているということです。

(図表を用意)

削除機能追加時の注意点

「外部キー制約」を持たせている場合には、dependent: :destroy(依存して一緒にdestroy)の追記が必要です。

例えばtwitterクローンの場合。

ユーザ退会機能を実装する際、userテーブルのid = 1のレコード(のみ)を消すと、favoritesテーブルのuser_id = 1というレコードから見ると「あれ?user_id = 1のuserがいないけど」となってしまい、エラーが発生します(=外部キー制約の違反になってしまう。)

なので、userテーブルのid = 1のレコードを消すときには、favoritesテーブルのuser_id = 1も依存して(=一緒)に消してあげるよう設定する必要がある。

それがdependent: :destroy

今回ならuserテーブルに依存しているのがfavoritesテーブルなので、

has_many :favoritesの後ろにdependent: : destroyを書けば良い。

f:id:over54:20200720160106p:plain

16〜18行目。

f:id:over54:20200720160042p:plain
すると、ユーザー情報を削除すると、そのユーザーがお気に入り登録していたpost_id等も一緒に消去してくれます。