我可以根据其他关联添加关联吗?

我的用户模型如下:

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 .. .. 

到目前为止,一切似乎都很好。

现在我希望User模型具有一个RoleExtensions集合,基于habtm Roles集合。

例:

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

所以我想:

 user.RoleExtensions 

返回在(1,2,3)中具有role_id的所有角色扩展

通常你会使用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 
 user = User.find(1)
 RoleExtension.find(:all,:conditions => [“role_id IN(?)”,user.role_ids])

否则,您可以使用嵌套连接。

试试这个 –

 # 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 
 @user.role_extensions.where(:joins => :roles)