LoginSignup
1
1

More than 3 years have passed since last update.

モデルのアソシエーションに別名をつける

Last updated at Posted at 2021-04-22

はじめに

自分のポートフォリオにフォロ-機能や通知機能を実装している際に、モデルのアソシエーションに別名をつけることがありました。再度、これがどういう意味なのか確認していきます。
あくまで、アウトプット用の分かり辛さがあるかと思いますが、ご了承ください。

モデルのアソシエーションに別名をつける

今回は、フォロー機能を実装すると仮定してUserモデルとRelationshipモデルを用意した場合のことを考えてみます。フォロー機能で難しいのは、Relationshipモデルを中間テーブルとして、Userモデル自身で多対多の関係であるという点です。

さっそく先にコードを見てみます。

user.rb
  #フォロー(こっち)側役
  has_many :relationships, dependent: :destroy
  has_many :followings, through: :relationships, source: :follow #架空モデル
  #フォロワー(あっち)側役
  has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id', dependent: :destroy #架空モデル
  has_many :followers, through: :reverse_of_relationships, source: :user #架空モデル

一行目は、単純にhas_manyでUserモデルとRelationshipモデルを関連づけています。
本題は二行目ですよね。
followingsなんて作ってないぞ!!って感じですよね。でもこれは実はUserモデルのことで、架空のモデルを作ったと考えるとイメージしやすいです。ただし、もちろん架空モデルなんてありませんから、その後ろで情報を付け加えてあげます。まず、through:relationshipsでRelationshipモデルは中間テーブルであるということを設定します。そして、source:followで、following配列の元はfollow_idの集合であるということを示します。
なお、follow_idはRelationshipモデルのカラムです。

つまり、二行目の部分は、Relationshipモデルを経由して、Relationshipのfollow_idに紐づけているわけです。

続いて、三行目です。
reverse_of_relationshipsという架空のモデルを同様に作っています。しかし、当然そんなものはないので後ろに情報を付け加えます。class_name:"Relationship"でこいつは実はRelationshipモデルですよと明示します。さらに、foreign_key: 'follow_id', dependent: :destroy の部分で外部キーの設定等をします。

まとめると、三行目は、Relationshipモデルの名前をReverse_of_relationshipsにしただけです。

そして四行目は、三行目のreverse_of_relationshipsを経由して、user_idに紐づけています。

relationship.rb
class Relationship < ApplicationRecord
  belongs_to :user
  belongs_to :follow,class_name: 'User'

relationship.rbでは、上記の通りです。

終わりに

こんな感じで、モデルのアソシエーションを別名で紐づけることができます。
DBの繋がりが複雑になると混乱してきますが、基礎をしっかりすればとても便利な技ですので、是非挑戦してみてください。

1
1
1

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
1
1