2015-09-28 88 views
0

我有一個名爲User的模型,對於我的模型,用戶既可以是Leader也可以是Member。在我的用戶模型我有這個在同一模型中有多對多關聯導軌

class User < ActiveRecord::Base 
    attr_accessible :username, :type 
end 

我想我可以創建在用戶模式這樣

class User < ActiveRecord::Base 
    attr_accessible :username, :type 

    has_and_belongs_to_many :users, :join_table => :team_members, :foreign_key => :team_leader_id 
end 

一個多一對多關聯,但我真的不知道如何去了解它。舉個例子。 用戶1 - 類型:組長 用戶2 - 類型:成員 用戶3 - 類型:成員。

我想創建一個關係,可以顯示用戶1爲用戶2和用戶3

的領導者,我還是有點新的軌道。

+0

你有一個'member'模型和'leader'模型?如果是這樣的話,可能最好在這些中定義它們。 – DickieBoy

回答

0

好,你有User表,用戶可以爲成員或領導人,

  • 如果你確信不會有任何其他角色
    • 可以使用boolean領導者,可以是true或如果錯誤意味着該用戶是假的成員
  • ,如果你不知道是否有可能是任何其他角色
    • 你可以用你目前正在使用的type列並可以包含memberleader這是第一部分。

,那麼你需要leader控制許多members則有2個possibilites:

  • 成員可以屬於只有1個領導者,那麼你將需要添加用戶表中的新列名爲leader_id例如在這種情況下這將是

    has_many :members, :class_name => "User", :foreign_key => :leader_id 
    
  • 紀念品ber可以屬於許多領導者,那麼您將需要創建多對多的關係,然後將使用包含leader_idmember_id的新表格,並且兩者都應該將用戶表格稱爲forigen鍵。


,以及優於一切,在User模型,這種關係其僅適用於Leader你可以有2種型號,從User繼承和被稱爲STISingle Table Inheritance你可以閱讀更多關於它here

class User < ActiveRecord::Base 
    # this type will be checked if Leader then its Leader model if Member then its Member model 
    self.inheritance_column = 'type' 
end 


class Member < User 
end 

class Leader < User 
    has_many :members, :class_name => "User", :foreign_key => :leader_id 
end 

這種模式是遠勝過一切,在這種情況下,讓我們在您的用戶模型假設有:

1 User type='Member' 
2 User type='Leaeder' 

如果你說:

# will work  
Member.find 1 
User.find 1 
# will fail as type is not Leader 
Leader.find 1 
0

添加leader_id到用戶

class User < ActiveRecord::Base 
    attr_accessible :username, :type 

    belongs_to :leader, class: User 
    has_many :members, class: User, foreign_key: :leader_id 
end 

使用:

@user_1 = User.create(name: "Jhon") 
@user_2 = User.create(name: "Tom", leader: @user_1) 

@user_1.members