##はじめに
ポートフォリオを作成する中で、モデルの関連付けについてコーディングしてみましたので、備忘録として残します。
####なぜモデルの関連付けを行うのか
これまで「なぜモデルの関連付けを行うのか」ということについて、あまり意識しませんでしたので、調べてみました。
モデルの関連付けを行うことにより、以下のようなメリットがあるようです。
・コードを簡略化できる
・コードを書かなくても、必要な処理をやってくれる(あるレコードを削除したら、別モデルの関連するレコードを削除してくれる等)
URL(http://d-policy.com/?p=278)
####今回やりたいこと(目的)
下記モデル関連図において、Userモデルのレコードを削除した際に、Meetingモデル・Relationshipモデルの関連するレコードを削除し、参照整合性を保つこと。
##モデル概要図
Userモデル |
---|
・id |
・name |
以下省略 |
Meetingモデル |
---|
・id |
・content |
・userid(外部キー) |
以下省略 |
Relationshipモデル |
---|
・follower_id(外部キー) |
・followed_id(外部キー) |
以下省略 |
##コード
下記のコードでうまくいきました。
####ポイント
①参照先モデル(Userモデル)側にオプション「dependent: :destroy」を記述
②Meetingモデルの外部キーを任意の値に指定(foreign_key: 'userid')
→外部キーを指定しない場合は、自動的に設定されるようです。今回のMeetingモデルの場合だと、外部キーが「user_id」としてSQLが発行されるようです。当該モデルには「user_id」というカラムは存在しないので、任意の値(userid)としました。
参考URL(http://www.coma-tech.com/archives/223/)
③Userモデル-Relationshipモデルの関連付けは、外部キーが2つ存在(follower_id、followed_id)
参考URL(https://qiita.com/takeoverjp/items/bb56d6a8eae191cd3732)
class User < ApplicationRecord
#Meetingモデルとの関連付け
has_many :meetings, class_name: 'Meeting', foreign_key: 'userid', dependent: :destroy
#Relationshipモデルとの関連付け
has_many :relationship_follower, class_name: 'Relationship', foreign_key: 'follower_id', dependent: :destroy
has_many :relationship_followed, class_name: 'Relationship', foreign_key: 'followed_id', dependent: :destroy
end
class Meeting < ApplicationRecord
belongs_to :user , class_name: 'User'
end
class Relationship < ApplicationRecord
belongs_to :user, class_name: 'User'
end