2012-08-28 58 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 

(代碼未被選中)