has_many через помощь, что я делаю не так? - PullRequest
1 голос
/ 07 марта 2011

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

User
   has_and_belongs_to_many :Roles

Role
   has_and_belongs_to_many :Users

таблиц:

roles_users
   user_id
   role_id

roleGroups
   id
   role_id
   some_column

Теперь я хочу создать еще одну ассоциацию для модели User, которая будет представлять собой совокупность всех групп ролейпользователь принадлежит.

т.е. если пользователь находится в ролях с идентификаторами 1 и 2, то извлекает все группы ролей, где role_id = 1 и 2.

Я думаю, что мне нужноиспользовать сквозной канал, потому что он основан на праве ассоциации ролей пользователя?

Я пытался:

User
   has_many  :RoleGroups, :through => :Roles

Role
   has_many :RoleGroups, :through => :User

Но я получаю сообщение об ошибке:

ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection macro :has_many :through for has_many :RoleGroups, :through => :Roles.  Use :source to specify the source reflection.

Обновление Хорошо, теперь мои модели выглядят так:

User
   habtm :Roles
   has_many :RoleGroups, :through => :Roles

Role
  habtm :Users
  has_many :RoleGroups

RoleGroup
  belongs_to :Role

MySQL таблиц:

roles_users
   user_id
   role_id

role_groups
   id
   role_id
   col3
   col4
   ..

Если я сделаю:

u = User.find(1)
u.Roles  (works fine)
u.RoleGroups   #see error

Сообщение об ошибке:

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'roles.user_id' in 'where clause': SELECT `role_groups`.* FROM `role_groups` INNER JOIN `roles` ON `role_groups`.role_id = `roles`.id WHERE ((`roles`.user_id = 1))

Ответы [ 2 ]

0 голосов
/ 08 марта 2011

Вы не можете делать это так, как вы думаете.Я не уверен, почему вы используете заглавные буквы для своих ассоциаций, но есть и другие неправильные вещи.

Во-первых, RoleGroups зависает от Role (через has_many, но больше начто в секунду), что означает, что у вас нет прямой связи между User и RoleGroup.

Во-вторых, из вашего обновленного объяснения следует, что каждый RoleGroup может иметь более одного Role, что нормально, но в вашем коде Role has_many :role_groups, что означает, что каждая роль может иметь более одной группы ролей.Это нелогичное именование, но, возможно, намеренное.Я собираюсь предположить, что ваши группы ролей содержат несколько ролей, а не наоборот.

В-третьих, вы не можете использовать HABTM в качестве :through модели.HABTM использует только таблицу в базе данных, а не модель Rails, поэтому информацию в вашей таблице roles_users нельзя использовать напрямую;has_many :foos :through => :bars требуется актуальная Bar модель.

# Models
User
  habtm :roles

Role
  habtm :users
  belongs_to :role_group # add role.role_group_id attribute

RoleGroup
  has_many :roles # remove role_groups.role_id attribute

# Console
u = User.find(1) # get user
r = u.roles      # get user roles
u.roles.collect { |role| role.role_group.name } 
# ["Administrative","Editorial","User"]
0 голосов
/ 07 марта 2011

Вы ищете ассоциацию has_and_belongs_to_many.

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