こんにちは!
今回はテーブル作成時に使用するカラムreference型について紹介します!
reference型を使う時はいつ?
外部キー(FK, foreign keyともいう)を作成したいとき、integer型を用いてt.integer: xxx_idと単純に作ることもできますが、下の例のようにreference型を使うこともできます。
t.references: user, foreign_key: true
t.references: group, foreign_key: true
このように用いますが、reference型を知らない方は、あれ?外部キーを作るのにカラム名に_idが抜けてる?となると思います。
実は、reference型はマイグレーションファイル上ではuserやgroupとしか表示されて
いませんが、 rails db:migrate後にuser_id、group_idのように自動で外部キーのカラムが作成されるという特徴があります。
外部キー制約が必要!!
しかし、ターミナルでモデルを作成後はまだ外部キーとしての機能はありません。そこで、外部キー制約をマイグレーションファイル上に記述することで、rails db:migrate後に外部キーとして機能します。
上の例だと外部キー制約はforeign_key: true
の部分にあたります。
reference型を使って外部キーを作成する際は必ず外部キー制約の記述を忘れないようにしましょう!
ちなみに、add_foreign_keyとして記述することも可能
先ほどのカラム名の後ろではなく、まとめて書いても大丈夫です!
class CreateGroupUsers < ActiveRecord::Migration[6.1]
def change
create_table :group_users do |t|
t.references :user
t.references :group
t.timestamps
end
add_foreign_key :user, :group
end
end
参考させていただいた記事はこちらです!
余談
ちなみに、中間テーブルが必要になったときはこのような書き方(reference型)が便利です!
中間テーブルが必要になるときというのは、繋げたいテーブルがどちら側からみても1:Nの関係にあるときで、テーブル同士の関係はN:M(多:多)となるときです。中間テーブルに2つのテーブルの外部キーを持たせることで、2つのテーブルが関係性をもったときにそのテーブルどうしの繋がりがどのようになっているか分かりやすく、管理も容易になります。