7

私はこれを理解する/頭を包むのに苦労しています。これを可能にする関係を作成しようとしています:

  • ユーザーは多くのグループに所属できます
  • グループには多くのユーザーを含めることができます
  • グループにはユーザーである所有者がいます
  • グループの所有権は譲渡可能です

多対多の関係を設定しましたが、所有権機能の設定方法がわかりません。

私のモデルでこれまでに持っているものは次のとおりです。

    class Group < ActiveRecord::Base
      has_and_belongs_to_many :users
      attr_accessible :name, :description, :isPublic, :tag_list, :owner
    end

    class User < ActiveRecord::Base
      has_and_belongs_to_many :groups
      attr_accessible :name, :description, :owner_id
    end

どんな助けでも大歓迎です!!

4

4 に答える 4

14

いくつかの方法で設定できます。

1) 結合モデルを使用し、グループ メンバーが所有者であることを指定するフラグを結合モデルに配置します。

class Group < ActiveRecord::Base
  has_many :memberships
  has_many :users, through: :memberships
  attr_accessible :name, :description, :isPublic, :tag_list, :owner
end

class Membership < ActiveRecord::Base
  belongs_to :group
  belongs_to :user

  #this table has a flag called owner and thus a method called owner?
end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, through: :memberships
  attr_accessible :name, :description, :owner_id
end

2) 既存の HABTM を保持し、所有権を追跡するための別の結合モデルを追加します。

class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
  has_many :group_ownerships
  has_many :owners, through: :group_owernships, class_name: "User"
  attr_accessible :name, :description, :isPublic, :tag_list, :owner
end

class GroupOwnership < ActiveRecord::Base
  belongs_to :group
  belongs_to :user
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
  has_many :group_ownerships
  has_many :owned_groups, through: :group_owernships, class_name: "Group"
  attr_accessible :name, :description, :owner_id
end
于 2013-03-15T21:43:46.477 に答える
3

belongs_to解決策の 1 つは、グループから所有者への新しい関係を定義することだと思います。user_idそのため、テーブルに新しい列を追加する必要がありgroupsます。

class Group < ActiveRecord::Base
  has_and_belongs_to_many :users
  belongs_to :owner, class_name: 'User', foreign_key: 'user_id'
  attr_accessible :name, :description, :isPublic, :tag_list, :owner
end

class User < ActiveRecord::Base
  has_and_belongs_to_many :groups
  has_many :owned_groups, class_name: 'Group', foreign_key: 'user_id'
  attr_accessible :name, :description, :owner_id
end

それが必要だと思います。ユーザーと一緒に、彼がメンバーであるuser.groupsすべてのグループを持つことができ、彼が所有するすべてのグループを持つことができますuser.owned_groups。グループを使用すると、その所有者 :group.ownerとそのすべてのメンバー : を持つことができますgroup.users

所有者を変更したい場合は、インスタンスgroup.owner = new_usernew_user開始するだけですUser

関連付けと外部キーの名前付きを簡単に選択したことに注意してください。もちろん、それをカスタマイズすることもできます。

于 2013-03-15T21:41:21.153 に答える
0

ユーザーモデルにブールフィールドを所有者として追加します。そのため、ユーザーの作成中に、彼が所有者であるかどうかを割り当てることができます。
したがって、グループに対してチェックしたい場合は、以下のように行うことができます。

group.users.each do |u|
あなたの所有者?
// ここにロジックが入ります
end

于 2013-03-16T04:23:46.133 に答える
0

リンクテーブルアプローチはどうですか?

ユーザーとグループへのリンク テーブルを users_groups として持っている場合、ユーザーとグループが互いに属している瞬間に、別の新しい属性をそのテーブルに実際に格納できるからです。

例のように、ユーザーのジョンはグループの男の子に属していて、いたずら好きです。ユーザーのジョンがエンジニアグループに所属している場合、彼は賢いです。したがって、users_groups テーブルには、以下のようなものを格納できます。

ユーザー

id | Name
1 | John
2 | Steve

グループ

id | Name
1| boys
2| doctors
3| beggars

ユーザー_グループ

user_id | group_id | info
1       | 1        | "naughty"
1       | 2        | "wearing white coat"
1       | 3        | "broke"
2       | 1        | "liar"

楽しそうじゃないですか。しかし、ええ、私たちはハスに取り組まなければならず、多くの関係に属しています. しかし、ただの考えです!

リンクテーブルを持つことの利点について言及しました。その実装は、彼の回答でSean Hillによって処理されます。

于 2013-03-15T21:50:34.320 に答える