ume

rails model referenceとは?

対象者 

  • 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を使った方が自身で記述する量が減りタイプミスが理由のエラーを防げる。