外部キーはマイグレーションで設定する場合と、モデル側でRailsの機能として設定する場合の2種類あります。実務ではマイグレーションでは外部キー制約は設定しない傾向にあるように思えます。(データの用意が面倒になりますからね。)
「マイグレーション」で外部キーを設定したい場合
「user:post=1:多」の場合
reference型を使う場合
1 2 3 4 5 6 7 8 9 10 |
class CreatePosts < ActiveRecord::Migration[6.0] def change create_table :posts do |t| t.string :name t.references :user,foreign_key:true t.timestamps end end end |
reference型の仕様
- 「モデル名_id」というカラム名を自動で生成する。
- インデックスを自動で付与してくれる。
- 外部キー制約は付与しない。(したい場合は「foreign_key:true」と指定する必要があります。)
reference型を使わない場合
1 2 3 4 5 6 7 8 9 10 11 |
class CreatePosts < ActiveRecord::Migration[6.0] def change create_table :posts do |t| t.string :name t.integer :user_id t.timestamps end add_foreign_key :posts, :users # add_foreign_key :対象のテーブル名, :指定先のテーブル end end |
add_foreign_keyを使えば、post_idには自動でインデックスが付与されるので「add_index」や「index:true」が不要になります。
「リレーション」での外部キーの決定のされ方(モデル側)
通常
1:多の多の方のテーブルで「参照先のモデル名」 + 「_id」という名前のカラムを付けたら自動的に外部キーと決定される。
異なるカラムを外部キーにしたい場合
1 2 3 |
class 親モデル名 < ActiveRecord::Base アソシエーション :子モデル名, foreign_key: '親モデルが子モデルの中で参照する外部キー名' end |
アソシエーション
has_manyや、has_one、belongs_toの事です。
この記事へのコメントはありません。