2011-03-07 64 views
1

我的用戶模型是這樣的:我可以添加一個基於另一個關聯的關聯嗎?

User 
    habtm :Roles 


Role 
    habtm :Users 


RoleExtension 
    belongs_to :Role 

MySQL表:

users 
    id 
    .. 


roles 
    id 
    .. 

roles_users 
    user_id 
    role_id 

role_extensions 
    id 
    role_id 
    feature_id 
    .. 
    .. 

現在似乎一切都工作正常爲止。

現在我希望用戶模型擁有基於habtm Roles集合的RoleExtensions集合。

例如:

user = User.find(1) 
user.Roles (returns roles with id's of 1,2,3) 

所以我想:

user.RoleExtensions 

返回已在(1,2,3)

+0

user.roles.role_extensions? – corroded 2011-03-07 04:45:25

+0

user.Role [0] .RoleExtensions能夠工作,但我希望所有的RoleExtensions不僅僅是特定角色的角色擴展。 – Blankman 2011-03-08 02:26:11

回答

1

東西通常你會使用一個has_many, :through關聯,但這並不適用於has_and_belongs_to_many關係。

所以,相反,在您的用戶模式:

def role_extensions 
    return roles.inject([]) do |array, role| 
    role.role_extensions do |re| 
     array.include?(re) ? array << re : array 
    end 
    end 
end 

然後my_user.role_extensions應該回到屬於該用戶的所有角色的所有角色擴展的陣列。

注:我沒有測試過這一點,但它應該工作

更新:我喜歡這個更好

def role_extensions 
    return roles.inject([]) { |array, role| array << role.role_extensions }.flatten!.uniq 
end 
+0

事實上,您之前回答的問題其實已經回答了(我是這麼做的),但我希望自己在協會中做錯了事情,因爲我想知道這一點! – Blankman 2011-03-08 03:33:54

0
 
user = User.find(1) 
RoleExtension.find(:all, :conditions => ["role_id IN (?)", user.role_ids]) 

否則,你ROLE_ID所有角色擴展可以使用嵌套連接。

+0

我怎麼能使這個關聯在用戶雖然?如何獲得role_ids?我是新來的! – Blankman 2011-03-07 04:59:32

0

試試這個 -

# Fetch user object 
user = User.first 

# If you want roles of that user try this 
roles = user.roles 

# You can map all the role extensions of that user by 
role_extensions = user.roles.map(&:role_extensions).uniq 

要知道,這將是大量的角色極其緩慢。在這種情況下,最好編寫你自己的查詢方法。像

role_extensions = RoleExtension.where("role_id in (?)", user.role_ids).all 
0
@user.role_extensions.where(:joins => :roles) 
+0

會是@ user.RoleExtensions還是@ user.role_extensions,感到困惑? – Blankman 2011-03-07 17:25:39

相關問題