2011-04-08 3 views
3

: 사용자, 팀 및 회원 -레일 복잡한 대다 내가 3 개 모델있어 쿼리

class Team < ActiveRecord::Base 
    has_many :memberships 
    has_many :members, :through => :memberships, :source => :user 
end 

class User < ActiveRecord::Base 
    has_many :memberships, :dependent => :destroy 
    has_many :teams, :through => :memberships 

    def team_mates 
    teams = Team.where(:members => id) 
    team_mates = teams.members 
    end 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :team 

    validates :user_id, :presence => true 
    validates :team_id, :presence => true 
end 

을, 나는 꽤 사용자에 team_mates 방법을 작성하는 방법을 알아낼 수 없습니다 모델. current_user를 사용하여 팀에 속한 다른 사용자의 배열을 반환해야합니다. 내 생각으로는 현재 사용자가 회원 인 팀만 포함하도록 팀을 제한하는 범위를 사용해야하지만 구문을 이해할 수는 없습니다. 이것에 대한 도움은 크게 감사 할 것입니다.

감사합니다.

답변

5

회원 테이블을 사용하여 방법을 호출하는 사용자와 팀을 공유하는 사용자를 찾습니다. 그런 다음 현재 사용자와 팀을 두 명 이상 공유하는 중복 사용자를 필터링하려면 별명을 사용하십시오.

나는 아래의 코드를 테스트하지 않은,하지만 희망이 옳은 길에 당신을 얻을 것이다 :

그 대답 돈 '의 Arel 방법의 일부처럼 보이는

def team_mates 
    m = Membership.scoped.table 
    Users.join(m).where(m[:team_id].in(team_ids)).project('distinct users.*') 
end 

UPDATE ActiveRecord land에 쉽게 매핑 할 수 있습니다. (누군가가 어떻게 알고 있다면 나는 알고 싶다!) 또한 '현재 사용자'를 반환합니다. 이 대신에보십시오 :

def team_mates 
    User.joins(:memberships).where('memberships.team_id' => team_ids).where(['users.id != ?', self.id]).select('distinct users.*') 
end 
+0

감사합니다. 우리가 해결책에 가까워지고있는 것 같습니다. 조인을 작동 시키려면 socoped.table로 사용자를 캐스팅해야했습니다. 그러나 이제 함수는 사용자 배열 대신 Arel :: SelectManager를 반환합니다. Arel :: SelectManager에서 사용자 배열을 추출하는 방법에 대한 아이디어가 있습니까? 여기 내 코드 (무서운 서식 미안)이다 : ' m = Membership.scoped.table U = User.scoped.table u.join (m) 어디에요 (m 데프 team_mates [: team_id] 실천할 (team_ids)). project ('distinct users. *') end' – spinlock

+0

내가 원하는 것을 ActiveRecord Relation 객체로 변환하는 방법에 대해 살펴볼 것입니다. 아마도 그 마지막 문장의 결과를 가져 와서'.to_sql'을 한 다음'User.find_by_sql'에 그것을 전달할 수 있습니다 : def team_mates; m = Membership.scoped.table; u = User.scoped.table; sql = u.join (m) .where (m [: team_id] .in (team_ids)). project ('개별 사용자. *'). to_sql; User.find_by_sql (sql); end' – ctcherry

+0

이 답변의 업데이트를 확인하십시오. – ctcherry

3

방법에 대한이?

User.joins(:memberships).joins(:teams).where("teams.id" => id).uniq