📖
[Rails]グループ機能の作成(モデル)
group.rb(グループモデル)
class Group < ApplicationRecord
#(1)
belongs_to :owner, class_name: "User"
#(2)
has_many :group_memberships, dependent: :destroy
#(3)
has_many :members, through: :group_memberships, source: :user
end
(1) belongs_to :owner, class_name: "User"
- Group モデルに belongs_to :owner と書かれているので、Group モデルはownerに属している。
- Owner というモデルはない。
class_name: "User"
部分で、Rails に 「この owner は User モデルのことだよ」 と教えている。
⬇️
つまり…
- Group は User に属するが、通常の user_id ではなく、owner_id という外部キーを持つ。
- owner という関連名で、実際には User を参照する。
(2) has_many :group_memberships, dependent: :destroy
- Group(グループ)は多くの group_memberships(グループメンバーシップ)を持つ。
- dependent: :destroy により、グループが削除された場合、関連するgroup_membershipsも削除される。
(3) has_many :members, through: :group_memberships, source: :user
- group_memberships を通じて members という関連付けを定義している。
- source: :user により、group_memberships テーブルの user を members として扱う。
- つまり、グループのメンバーは group_memberships を通じて User となる。
has_many :through関連付け
has_many :through関連付けは、他方のモデルと「多対多」のリレーションシップを設定する場合によく使われます。この関連付けでは、2つのモデルの間に「第3のモデル」(joinモデル)が介在し、それを経由(through)して相手のモデルの「0個以上」のインスタンスとマッチします。
Railsガイドより引用
user.rb(ユーザモデル)
class User < ApplicationRecord
#(4)
has_many :owned_groups, class_name: "Group", foreign_key: "owner_id", dependent: :destroy
#(5)
has_many :group_memberships, dependent: :destroy
#(6)
has_many :groups, through: :group_memberships
end
(4) has_many :owned_groups, class_name: "Group", foreign_key: "owner_id", dependent: :destroy
- User は owner_id(group.rbで設定した通り、User の id をowner_idとしている) を foreign_key(外部キー) とする Group を複数持つことができる(グループのオーナーとして)。
- ユーザが削除されたら、そのユーザがオーナーのグループも削除される。
(5)has_many :group_memberships, dependent: :destroy
- ユーザは複数のgroup_memberships を持つ(どのグループに所属しているかを表す中間テーブル)
(6)has_many :groups, through: :group_memberships
- group_memberships を通じて、groups という関連付けを定義。(group.rb(グループモデル)でも出てきたthroughを使っている)
⇒つまり、ユーザーが group_memberships を介して Group に所属していることを示す。
group_membership.rb(グループメンバーモデル)
class GroupMembership < ApplicationRecord
belongs_to :user
belongs_to :group
end
つまり…
- Group は group_memberships を通じて members(ユーザー)とつながっている。
- User は group_memberships を通じて groups(所属グループ)とつながっている。
- User は owner_id をキーとして Group(所有グループ)を持つことができる。
参考文献
Discussion