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

时间:2011-03-07 04:29:40

标签: ruby-on-rails

我的用户模型如下:

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的所有角色扩展

4 个答案:

答案 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)