プログラミング初心者でも理解できる内容を書いていければと思います。
railsでmigrateする際に、カラムにモデルの関連づけのために外部キーを追加する方法を整理します。
前提としては、ユーザーと、そのユーザーの複数の投稿(tweet)を紐付けたい、ということです。
◉外部キーをテーブルに追加する
そのためには、新しく作成するtweetsテーブルに user_id というカラムを追加して、投稿を所有しているユーザーの id を格納するようにします。
このような場合では、referenceというデータ型を使用して外部キーのカラムを追加します。
tweetsテーブルを作成するマイグレーションファイルを、こんな感じに記述します。
class CreateTweets < ActiveRecord::Migration[5.2]
def change
create_table :tweets do |t|
t.string :text, null: false
t.references :user, foreign_key: true, null: false
t.timestamps
end
end
end
t.references :user, foreign_key: true ここですね。
t.referencees :user で、user_idというカラムを作成してくれます。そしてindexを自動で付与してくれます。indexにより検索が楽になります。
ただし、データの読み込みや取得が早くなるメリットがあるかわりに、書き込みの速度が遅くなるというデメリットがあるみたいです。
これだけだと、外部キー制約はつかないので、
foreign_key: true をつけます。
また、既存のテーブルに外部キーを追加したい場合は次のようになります。
class AddColumn < ActiveRecord::Migration[5.0]
def change
add_reference :tweets, :user, foreign_key: true
end
end
ちなみに、、、
null: false と記述することで、NOT NULL制約をつけることができます。データベースカラムの値にNULLを格納したくない場合に、つまり、あるモデルの属性の値が必ず入らなければいけないと期待するときに、このような制約をつけます。