📖

[Rails]グループ機能の作成(モデル)

2025/02/05に公開

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(所有グループ)を持つことができる。

参考文献

https://qiita.com/shinpei-hattori/items/4110290161cf3bf245f9
https://railsguides.jp/association_basics.html#has-many-through関連付け

Discussion