我无法理解/包围我的大脑。我正在尝试创建一个允许这样的关系:
我已经设置了多对多关系,但我似乎无法理解如何设置所有权功能。
这是我目前在模特中所拥有的:
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
非常感谢任何帮助!!
答案 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?
//逻辑到这里
端