我的用户模型如下:
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的所有角色扩展答案 0 :(得分: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
答案 1 :(得分:0)
user = User.find(1) RoleExtension.find(:all, :conditions => ["role_id IN (?)", user.role_ids])
否则您可以使用嵌套连接。
答案 2 :(得分: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
答案 3 :(得分:0)
@user.role_extensions.where(:joins => :roles)