2

Rails のポリモーフィック アソシエーションを把握するのに苦労しています。グループとユーザーの 2 つのモデルがあります。

ユーザーはグループに所属する必要がありますが、グループは複数のユーザーと複数のグループを持つことができます。グループをツリーのようにする必要があり、Ancestry gem が役立つと思いますが、まだ試していません。

user_id と group_id を持つ何らかの結合モデル、Membership が必要なようです。次に、 has_many :through を実行してユーザーをグループに関連付けることができますが、どうすれば多くのグループも持つことができるでしょうか? メンバーシップはポリモーフィック モデルになりますか?

ありがとう!

アンディ

4

3 に答える 3

4

これは多態的な関連ではありません。ポリモーフィックアソシエーションは、人や犬のクラスに属する画像クラスなど、クラスタイプを超越したアソシエーションです。

グループが別のグループに属し、他のグループを持つことができる単一テーブル継承について話している。以下のようなものがあなたが探しているものです。

これは単なるエアコードであり、微調整が必​​要な場合があります

class User
  belongs_to :group
end

class Group
  has_many :users
  has_many :sub_groups, :class => "Group", :foreign_key => :parent_group_id
  belongs_to :parent_group, :class => "Group", :foreign_key => :parent_group_id
end
于 2011-05-18T14:12:42.147 に答える
2

はい、あなたは基本的にそれを持っています。メンバーシップモデルには、次のフィールドが必要です。

group_id
member_id
member_type

group_idは、「メンバー」が属するグループです。member_idはPersonまたはGroupのIDであり、member_typeは'Person'または'Group'です。

メンバーシップには、次の関連付けがあります。

class Member < ActiveRecord::Base
  belongs_to :member, :polymorphic => true
end

次に、ユーザークラスとグループクラスは次のようになります。

has_many :memberships, :as => :member
于 2011-05-18T14:13:00.353 に答える
2

Ancestry が正しい答えだと思います。私はずっと古いもの、acts_as_tree を使用しましたが、役に立ちました。今、新しいプロジェクトを開始するには、Ancestry を使用します。他の回答が示唆しているように、それがなくても実行できますが、Ancestry が提供するすべての無料のメソッドを取得することはできません。

于 2011-05-18T15:31:24.490 に答える