2011-08-14 80 views
4

我搜索了一下,詢問這之前,但我可以肯定搞不定......有一個表多個關聯

我有其中有一個經理標識,一個designer_id和其他用戶組模型對應於此組中不同用戶角色的ID。它們是具有不同外鍵的組模型中的has_one用戶關聯。

我試過用戶模型中的多個belongs_to關聯,但是......屬於該組的用戶(他們有一個group_id列)可以是這些角色之一,我真的不知道如何檢查這些以及如何在用戶模型中進行關聯。

預先感謝您。

PS:使用者只能屬於一個組,這就是爲什麼我簡單地把GROUP_ID在用戶模式,而不是基於連接表。

回答

3

如果作爲一個經理或一組設計師意味着有人爲成員,如果該組中,有沒有辦法,你可以很容易地做到這一點,你應該創建一個會員制模式,具有「角色」屬性,說這用戶代表特定組的作用,這裏是它會是什麼樣子:

class User 
    has_one :membership 
end 

class Group 
    has_many :memberships 
end 

class Membership 
    belongs_to :group 
    belongs_to :user 
    validates_presence_of :role 
    validates_inclusion_of :role, :in => [ 'manager', 'designer', 'member' ] 
    validates_uniqueness_of :user_id, :scope => :group_id 
end 

這給你的功能,甚至允許你定義爲你的團體儘可能多的角色

+0

我想這就是我一直在尋找!在將其標記爲已解決之前,我正在測試它。謝謝。 – Cydonia7

0

belongs_to是更強大的比你想象

例如,創建有關經理belongs_to的關聯,在用戶

在用戶等級:

belongs_to :manager, :primary_key => :manager_id, :class_name => "User" 

這將做查詢,查詢,其中在用戶(一個或多個)表中的manager_id字段匹配在組(多個)表中的manager_id

或者,如果在用戶表中的列是稱爲「經理標識」:

belongs_to :manager, :foreign_key => :my_manager_id, :primary_key => :manager_id 

將在用戶(或多個)表中的my_manager_id列匹配了該組的manager_id柱( s)表。

那麼你應該能夠做到:

user.manager.exists? 

,什麼具備的,你

編輯:也有可能我不太瞭解你的數據模型,但我認爲這方法也可以用has_one :manager, :through => :group情況下工作。例如,has_one :manager, :through => :group。除了:foreign_keyclass_name不會在這些情況下工作,按照文檔has_on,因爲「爲選項:CLASS_NAME和:foreign_key被忽略,因爲聯想使用源反射」。