####※ 関連付け(アソシエーション)とは
テーブル間の関係を、モデル上の関係として操作できるようにする事。
###【モデル作成時に関連付けを設定する方法】
例として、1人のユーザー(Userモデル)が多くのつぶやき(Tweetモデル)を作成する場合。
※Userモデルはすでに存在しているものとします。
####1. Modelの作成
$ rails g model Tweet content:string user:references
user:references
の指定で、Tweetモデルにuser_idカラムが作成されます。
※references=参照
####2. 作成されたマイグレーションファイルの確認
class CreateTweets < ActiveRecord::Migration[5.2]
def change
create_table :tweets do |t|
t.string :content
t.references :user, foreign_key: true
# foreign_key: true 👈 外部キー制約
t.timestamps
end
end
end
※外部キー制約:
1. Usersテーブルに存在しない値を外部キーとして登録不可
2. Tweetsテーブルの外部キーに値が登録されているUsersテーブルのレコードは削除不可
####3. マイグレーション実行
rails db:migrate
####4. shema.rbで確認
create_table "tweets", tweets: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
t.string "content"
t.bigint "user_id" # reference型でuser_idカラム生成
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["user_id"], name: "index_opinions_on_user_id"
end
####5. Tweetモデルを確認・Userモデルを編集
class Tweet < ApplicationRecord
belongs_to :user
end
作成されたtweet.rb
にはuserに属する(belongs_to)が記述されます。
これに対して、Userモデルにtweetを所有する(has_many)を追記します。
class User < ApplicationRecord
has_many :tweets, dependent: :destroy
# 多数のつぶやきを持つ為、tweetsと複数形にする
end
※dependent: :destroy
は、先に書いた外部キー制約でエラーが出ない為の設定。
これにより、Userが削除された場合、属するtweetsも削除されます。
以上の設定で、User has many Tweets
、Tweet belongs to user
の関連付けができます。
関連付けしていない・している場合の例
ユーザーのつぶやきを取得
・関連付け無し場合
@user = User.find(params[:id])
Tweets = Tweet.where(user_id: @user.id)
・関連付けした場合
@user = User.find(params[:id])
Tweets = @user.tweets
省略できますね!