多对多用户和组,但组拥有所有者

我无法理解/包围我的大脑。 我正在尝试创建一个允许这样的关系:

  • 用户可以属于多个组
  • 组可以有很多用户
  • 一个组拥有一个用户所有者
  • 集团所有权可以转让

我已经设置了多对多关系,但我似乎无法理解如何设置所有权function。

这是我目前在我的模型中所拥有的:

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 

任何帮助将不胜感激!!

您可以通过以下几种方式进行设置:

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 

我认为一个解决方案可能是定义从组到所有者的新的belongs_to关系。 因此,您需要在groups表中添加新的user_id列。

 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

如果要更改所有者,只需使用new_user group.owner = new_user new_user开始一个User实例

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

链接表方法怎么样?

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

就像当时,约翰这个用户属于男孩组,他很顽皮。 当John用户属于工程师团队时,他很聪明。 所以在users_groups表中,我可以存储类似下面的内容。

用户

 id | Name 1 | John 2 | Steve 

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

Users_Groups

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

这不好玩吗? 但是,是的,我们必须研究Has并且属于许多关系。 但只是一个想法!

只是提到了有一个链接表的优点。 Sean Hill在他的回答中对此进行了实施。

在您的用户模型中添加一个布尔字段作为所有者,因此在创建用户时,如果他是所有者,则可以分配。
因此,如果你想检查组,你可以这样做。

group.users.each do | u |
u.owner?
//逻辑在这里
结束