対象者
- referenceとはなんぞやという方
referenceとは?
⇨references型は新しく作成するテーブル(Post)のカラムに、作成済みのテーブル(User)を指定する場合に使います。要は新しいテーブル(Post)のカラムに既存のテーブル(User)の主キーの外部キー(user_id)を自動作成してくれる
例 ↓のように新しくPostテーブルを作成するときにuser_idという外部キーをPostテーブルに持たせたいとする。 下記のコマンドでPostテーブルを作成とカラムを作成します。
rails generate model Post title:string content:text user:references
user:references #モデル名:referenceでモデル名_idというカラムを生成します。ここではuser_idを作成するという意味
この↑コマンドを実行して自動で作られるモデルファイルとマイグレーションファイルの中身が↓
モデルファイル中身.
ここではモデルの関連性(Postテーブルから見たUserテーブルの関係性)が自動的に設定されます。注意:Userテーブルから見たPostテーブルの関係性(has_many)は自動生成されない。
class Post < ApplicationRecord belongs_to :user end
自動生成されたマイグレーションファイルの中身↓
class CreatePosts < ActiveRecord::Migration[6.1] def change create_table :posts do |t| t.references :user, null: false, foreign_key: true #user_idというカラムが生成される # 他のカラムの定義... t.timestamps end end end
これにより、Postモデルのインスタンスからuserメソッドを呼び出すことで関連するUserモデルのインスタンスにアクセスすることができます
post = Post.first user = post.user
referenceを使わなくても上記と同じことはできるが自分で記述量が増えタイプミスのリスクが上がるのでreferenceを用いて外部キーを生成した方が便利.
referenceなしで同じことをしようとした場合↓
rails generate model Post title:string content:text user_id:integer
user_id:integer #自分で外部キー作成
上記のコマンドを実行することでマイグレーションファイルが自動生成される。この時モデルファイルにモデルの関連性(Postテーブルから見たUserテーブルの関係性とUserテーブルから見たPostテーブルの関係性)を自分で定義する必要性がある.
マイグレーションファイルの中身↓
class CreatePosts < ActiveRecord::Migration[6.1] def change create_table :posts do |t| t.string :title t.text :content t.integer :user_id t.timestamps end add_foreign_key :posts, :users, column: :user_id ⇦#自分で記述しないとあかん。これはコンストレインと言ってデータベースに対して適用される制約 end end
まとめ
- referenceを使った方が自身で記述する量が減りタイプミスが理由のエラーを防げる。