LoginSignup
0
0

More than 5 years have passed since last update.

【RubyonRails】モデルの関連付けについて

Posted at

はじめに

 ポートフォリオを作成する中で、モデルの関連付けについてコーディングしてみましたので、備忘録として残します。

なぜモデルの関連付けを行うのか

 これまで「なぜモデルの関連付けを行うのか」ということについて、あまり意識しませんでしたので、調べてみました。

モデルの関連付けを行うことにより、以下のようなメリットがあるようです。
・コードを簡略化できる
・コードを書かなくても、必要な処理をやってくれる(あるレコードを削除したら、別モデルの関連するレコードを削除してくれる等)

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)

user.rb
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
meeting.rb
class Meeting < ApplicationRecord
  belongs_to :user , class_name: 'User'
end
relation.rb
class Relationship < ApplicationRecord
  belongs_to :user, class_name: 'User'
end
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0