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

时间:2013-03-15 21:33:02

标签: ruby-on-rails many-to-many

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

  • 用户可以属于多个群组
  • 群组可以拥有多个用户
  • 一个群组拥有一个用户
  • 团体所有权可以转让

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

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

    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 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分: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实例

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

答案 2 :(得分:0)

链接表方法怎么样?

因为,如果您有一个用户和组的链接表作为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在他的回答中照顾到了。

答案 3 :(得分:0)

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

group.users.each do | u |
u.owner?
//逻辑到这里 端