1

我有两个表,usersgroups。用户拥有一个组,可以分为多个组。一个组属于一个用户,可以有很多用户。设计两种模式有一个复杂的协会

因此,对于我的user模型我有

has_and_belongs_to_many :groups 
has_many :groups 

虽然我group模型我有

has_and_belongs_to_many :users 
belongs_to :user 

我也有一个连接表在我的迁移..

def change 
    create_table :groups_users, :id => false do |t| 
    t.integer :group_id 
    t.integer :user_id 
    end 
end 

我的问题是这是否有意义?我觉得我在has_and_belongs_to_many之上有has_manybelongs_to做错了。

+0

'的has_many:groups'和'belongs_to的:user'不需要 – codeit

+0

我将如何谁拥有组和组成员的用户区分? – jason328

回答

2

我会接近这一点,这是我个人的方法论的方式,是用3台/型号,像这样:

group_user.rb

class GroupUser < ActiveRecord::Base 
    attr_accessible :user_id, :group_id 

    belongs_to :group 
    belongs_to :user 
end 

group.rb

class Group < ActiveRecord::Base 
    attr_accessible :owner_id 

    validates_presence_of :owner_id 

    has_many :group_users 
    has_many :users, through: :group_users 
end 

user.rb

class User < ActiveRecord::Base 
    attr_accessible :some_attributes 

    has_many :group_users 
    has_many :groups, through: :group_users 
end 

然后,当你创建一个Group对象,创建它会有它id摆在Groupowner_id属性和它本身到GroupUserUser

+0

感谢您的回答。 – jason328

2

另一种选择是为了不使多个外键指向相同的关系,就是使用连接模型,然后在连接模型上添加一个标志来表示用户是否是所有者。

例如:

class User < ActiveRecord::Base 
    has_many :memberships 
    has_many :groups, through: :memberships 
    has_many :owned_groups, through: memberships, conditions: ["memberships.owner = ?", true], class_name: "Group" 
end 

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

    #This model contains a boolean field called owner 
    #You would create a unique constraint on owner, group and user 
end 

class Group < ActiveRecord::Base 
    has_many :memberships 
    has_many :users, through: :memberships 
    has_one :owner, through: :memberships, conditions: ["memberships.owner = ?", true], class_name: "User" 
end 
+0

既然你是第一个发布,我会给你信用。感谢你的回答。 – jason328

+0

谢谢,但我相信Leo Correa首先回答。 –

+0

啊,他做到了。那么我会改变答案。 – jason328