はじめに
自分のポートフォリオにフォロ-機能や通知機能を実装している際に、モデルのアソシエーションに別名をつけることがありました。再度、これがどういう意味なのか確認していきます。
あくまで、アウトプット用の分かり辛さがあるかと思いますが、ご了承ください。
モデルのアソシエーションに別名をつける
今回は、フォロー機能を実装すると仮定してUserモデルとRelationshipモデルを用意した場合のことを考えてみます。フォロー機能で難しいのは、Relationshipモデルを中間テーブルとして、Userモデル自身で多対多の関係であるという点です。
さっそく先にコードを見てみます。
#フォロー(こっち)側役
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に紐づけています。
class Relationship < ApplicationRecord
belongs_to :user
belongs_to :follow,class_name: 'User'
relationship.rbでは、上記の通りです。
終わりに
こんな感じで、モデルのアソシエーションを別名で紐づけることができます。
DBの繋がりが複雑になると混乱してきますが、基礎をしっかりすればとても便利な技ですので、是非挑戦してみてください。