アソシエーションとは
例えば、ブログを投稿したユーザー名を表示するには、ユーザーとブログモデルを関連付ける必要があります。
このような2つのモデル間の関連付けのことをアソシエーションといいます。
そして、この関連付けには外部キーが必要になってきます。
外部キー
外部キーとは、複数のテーブルを結びつける時に使用するカラムのことです。
関連付けのために、テーブルに関連付け用のカラムを追加します。
外部キーは関連付け先のテーブルでは主キーになります。
(例)ユーザー全員がuser_idという名札をつけることにより、ブログとの結びつきを表す、というのが外部キーのイメージです。
この時、一人のユーザーが複数のブログを所有するという関係性が成り立つので、ブログとユーザーは、一対多の関係性で紐づいていると言えます。
Blogテーブルにuser_idがあったら、user_idはusersにおいては主キー、blogテーブルでは外部キーと呼ばれます。
また、どちらが主で、どちらが従なのか?
という視点は、アソシエーションを設計する際にとても重要な情報になります。
外部キーの設定方法
実際にアプリを作り、動きを見ていきます。
既にUserモデルが作成されていると想定します。さらにBlogモデルも作成しますが、BlogモデルとUserモデルの関連付けをするために、テーブルに関連付け用のカラム(外部キー)を追加することが必要です。
それでは、blogテーブルにuser_idカラムを追加していきます。
rails g model Blog title:string content:text user:references
のように、 user:references
をつけて実行することで、Userモデルと関連付けするための外部キーを備えた、以下のようなマイグレーションファイルが出来上がります。
class CreateBlogs < ActiveRecord::Migration[5.2]
def change
create_table :blogs do |t|
t.string :title
t.text :content
t.references :user, foreign_key: true
t.timestamps
end
end
end
このように、
t.references :user, foreign_key: true
というコードが自動的に含まれています。foreign_key = 外部キー指定です。
外部キー制約とは
主キーと外部キーを使った制約のこと。
外部キー制約により、
- 存在しない値の外部キーが登録できない
- 親テーブルに外部キーが登録されている子テーブルのリソースが削除できない
というメリットがあります。