34
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Rails】references型について

Posted at

##references型とは
references型は新しく作成するテーブルのカラムに、作成済みのテーブルを指定する場合に使う。

既存のテーブルを参照するので、reference(参照という意味)。

##references使用法
referencesはrails g modelで、モデルとマイグレーションファイルを生成する時のカラムの型を指定するときに使う。モデル名(小文字):referencesの形で指定。

コマンド例: (userテーブルと紐付けたい、postテーブルを作成)
rails g model post name:string body:string user:references

上記のコマンドを実行すると、
reference型を指定したカラム名は テーブル名_id となる。
(user:reference であれば、 user_id というカラムが生成される)

referencesを指定したことで、生成されたモデルファイルにbelongs_to :userが追加される。

class Post < ApplicationRecord
  belongs_to :user
end

belongs_toとは
belongs_toとは他のテーブルとの関係性を示すもので、自分のテーブルが指定したテーブルの下に紐づいている(属している)ことを示す。

モデルの中で belongs_to :モデル名(単数形)として指定される。

親となるテーブルには、下に複数のテーブルが紐づくことを示すために、has_many :モデル名(複数形)を記述。

referencesを使えば、belongs_toは自動で記述されるが、has_manyはつかないので、自分で記述する必要がある。

マイグレーションファイルにも特別な記述が入る。

#この一文が追加される。
t.references :テーブル名, null: false, foreign_key: true

t.references
カラムが他のテーブルを参照していることを示す。

null: false
NULL値、つまり空欄を許可しないという指定。

foreign_key: true
外部キーであることを示している。

マイグレーション例:

class CreatePosts < ActiveRecord::Migration[6.1]
  def change
    create_table :posts do |t|
      t.references :user, null: false, foreign_key: true
      t.string :name
      t.string :body

      t.timestamps
    end
  end
end

foreign_key(外部キー)とは
外部キーとは指定したカラムの自由な記述を許可せず、指定したカラムの値のみしか使えないようにする制限のこと。

指定するには、マイグレーションファイルで、対象のカラムのオプションとして、foreign_key: true を追記。


rails db:migrateをいつも最後に実行するのを忘れてしまうので、忘れないこと。

##参考記事
【Rails】references型とは何か?わかりやすく解説。外部キー(foreign_key)とは?belongs_toやhas_manyの意味と実例

34
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?