2012-08-28 40 views
4

我有用户和组织加入模型UsersOrganisation。用户可能是组织的管理员 - 如果是,则is_admin布尔值为true。轨道has_many通过条件,建立新

如果我手动设置数据库中的is_admin布尔值,Organisations.admins按我的预期工作。

在控制台中,我可以做Organisation.first.users << User.first,它会创建一个organisations_users条目,如我所料。

但是,如果我做Organisation.first.admins << User.last它会创建一个普通用户,而不是管理员,即连接表上的is_admin布尔值设置不正确。

除了直接在连接表中创建条目之外,是否有这样做的好方法?

class User < ActiveRecord::Base 

    has_many :organisations_users 
    has_many :organisations, :through => :organisations_users 

end 

class Organisation < ActiveRecord::Base 

    has_many :organisations_users 
    has_many :users, :through => :organisations_users 
    has_many :admins, :through => :organisations_users, :class_name => "User", 
      :source => :user, 
      :conditions => {:organisations_users => {:is_admin => true}} 

end 

class OrganisationsUser < ActiveRecord::Base 

    belongs_to :organisation 
    belongs_to :user 

end 
+0

这确认'的has_many:管理员,:通过=> ... ...'会为选择工作实际,不用于插入数据。所以当你做'Organisation.first.admin << User.last'时,它只是创建普通条目。然而,我想知道如何做到这一点。 thnx为您的问题。 – Samiron

回答

2

有一些曲折与has_many :through<<运营商。但是你可以像@Erez回答那样重载它。

我的这种方法是使用范围(我改名OrganisationsUsers到成员):

class User < ActiveRecord::Base 

    has_many :memberships 
    has_many :organisations, :through => :memberships 

end 

class Organisation < ActiveRecord::Base 
    has_many :memberships 
    has_many :members, :through => :memberships, :class_name => 'User', :source => :user 

    # response to comment: 
    def admins 
    memberships.admin 
    end 
end 

class Memberships < ActiveRecord::Base 

    belongs_to :organisation 
    belongs_to :user 

    scope :admin, where(:is_admin => true) 
end 

现在我这样创建新管理员:

Organisation.first.memberships.admin.create(:user => User.first) 

我喜欢的作用域是你在会员阶层中定义“会员类型”,组织本身不必关心会员类型。

更新

现在你可以做

Organisation.first.admins.create(:user => User.first)

+0

有没有什么办法可以让'Organisation.first.admins.create(:user => User.first)' – Edward

+0

yes如果你在组织模型中创建一个小别名(参见我的编辑答案) – sled

+0

我已经结束为连接表创建一个嵌套的表单,但我已经接受了这个答案,因为它非常清楚地回答了我的问题。 – Edward

1

您可以尝试下面的组织模型代码。

class Organisation < ActiveRecord::Base 

    has_many :organisations_users 
    has_many :organisations_admins, :class_name => "OrganisationsUser", :conditions => { :is_admin => true } 

    has_many :users, :through => :organisations_users 
    has_many :admins, :through => :organisations_admins, :source => :user 

end 
+0

非常喜欢这种方法,因为它也解决了分配问题。 – Midnighter

5

你总是可以覆盖该协会的< <方法:

has_many :admins do 

    def <<(user) 
    user.is_admin = true 
    self << user 
    end 

end 

(代码未被选中)