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从组到所有者的新关系。因此,您需要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_user开始new_user一个User实例

请注意,我很快为关联和外键选择了命名,您当然可以自定义它。

于 2013-03-15T21:41:21.153 回答
0

那么链接表方法呢?

因为,如果您有一个到用户和组的链接表作为 users_groups,那么您实际上可以在用户和组属于彼此的时刻将另一个新属性存储到该表中。

就像当,约翰用户属于男孩组时,他很顽皮。当用户 John 属于工程师组时,他很聪明。所以在 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"

这不是很有趣吗?但是,是的,我们必须处理 Has 并且属于许多关系。但只是一个想法!

刚才提到了拥有一个链接表的好处。肖恩·希尔(Sean Hill)在回答中对此进行了处理。

于 2013-03-15T21:50:34.320 回答
0

在您的用户模型中添加一个布尔字段作为所有者,因此在创建用户时您可以指定他是否是所有者。
因此,如果您想检查该组,您可以按如下方式进行。

group.users.each 做 |u|
楼主?
// 逻辑到这里
结束

于 2013-03-16T04:23:46.133 回答