Могу ли я добавить ассоциацию, основанную на другой ассоциации? - PullRequest
1 голос
/ 07 марта 2011

Моя модель пользователя выглядит так:

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.

пример:

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

Итак, я хочу:

user.RoleExtensions 

для возврата всех расширений ролей, имеющих role_id в (1,2,3)

Ответы [ 4 ]

1 голос
/ 08 марта 2011

Обычно вы бы использовали 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 голосов
/ 07 марта 2011

Попробуйте это -

# 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 голосов
/ 07 марта 2011
@user.role_extensions.where(:joins => :roles)
0 голосов
/ 07 марта 2011
user = User.find(1)
RoleExtension.find(:all, :conditions => ["role_id IN (?)", user.role_ids])

В противном случае вы можете использовать вложенные объединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...