我可以根据其他关联添加关联吗?
我的用户模型如下:
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)