2011-03-06 3 views
1

내 모델은 다음과 같습니다has_many 도움을 통해, 내가 뭘 잘못하고있는거야?

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 

가 지금은 사용자가 속한 모든 roleGroups의 수집 할 사용자 모델에 다른 연결을 만들려고합니다.

즉, 사용자는 ID의 1, 2, 다음 ROLE_ID = 1, 2

나는 그것이 사용자의 역할을 기반으로하기 때문에 내가 통해를 사용할 필요가 있다고 생각하는 모든 RoleGroups를 가져와 역할에있는 경우 협회 맞지?

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 

오류 메시지 : 당신은 has_and_belongs_to_many 협회 찾고있는

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

답변

0

.

+0

사용자 + RoleGroup과 Role + RoleGroup 사이? 하지만 조인 테이블 RoleGroups에는 사용자 ID가 없습니다 ... – Blankman

+0

'has_and_belongs_to_many'가있는 조인 테이블의 모델은 필요하지 않습니다.링크 된 레일 가이드를 보면 테이블 레이아웃을 보여주는 다이어그램이 있습니다. –

+0

안녕하세요, 당신 타입이 맞았습니다. 하지만 여전히 작동하지 않습니다. user.RoleGroups, 질문에 오류를 넣습니다. – Blankman

0

생각하는대로 할 수 없습니다. 왜 당신이 당신의 협회를 자본화하고 있는지 나는 잘 모르겠지만, 다른 몇 가지 잘못도 있습니다.

첫째, RoleGroupsUserRoleGroup 사이의 직접 연결을 사용할 수없는 의미 (잠깐 더 많은 것을에 has_many를 통해,하지만) Role 떨어져 중단됩니다.

둘째, 정상이지만, 각 역할에 하나 개 이상의 역할 그룹을 가질 수 있음을 의미 코드 Role has_many :role_groups, 각 RoleGroup 하나 이상의 Role을 가질 수 있습니다 업데이트 된 설명에서 나타납니다. 직관적이지 못하지만 의도적 인 이름입니다. 저는 여러분의 역할 그룹이 다른 방법보다는 여러 역할을 포함한다고 가정 할 것입니다.

셋째, 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"] 
관련 문제