2012-10-29 2 views
0

여러 역할을 나타내는 조건문이있는 두 테이블 사이에 많은 관계가 여러 개 있습니다. 레일에서 관계를 지정하십시오.

class Course < ActiveRecord::Base 
    ... 
    has_many :course_mentors, :conditions => { :type_str => "mentor" }, :class_name => CourseUser 
    has_many :mentors, :through => :course_mentors, :source => :user 

    has_many :course_enrollees, :conditions => { :type_str => "enrollee" }, :class_name => CourseUser 
    has_many :enrollees, :through => :course_enrollees, :source => :user 
    ... 
end 

는 course.mentors 등 그러나 때로는 @ 함께 모두 가입자와 멘토를 얻을 수 있도록 편리 할 것, 단순히 course.enrollees @ 할 수있는 자체에 협회 중 하나의 내용을 검색하려면 .

필자는 단일 연관의 각 조합에 대한 추가 연결을 만드는 것이 비실용적 인 많은 서로 다른 연결을 가지고 있습니다. 항상 할 수있는 한

(@course.enrollees + @course.mentors).sort 

그러나 이것은 데이터베이스에 두 가지 요청을하고 결과적으로 중복 항목이 될 수 있습니다.

연관성에 대한 merge 함수도 조사했지만 빈 관계 만 반환합니다.

이렇게하는 것이 가장 좋은 방법은 무엇입니까?

has_many :course_users 

을 그리고 CourseUser 모델 내부의 범위를 넣어 :

답변

4

당신은 단순히 당신의 코스 모델 내부 CourseUser에 대한 일반적인 연결을 추가 할 수 있습니다

:

scope :of_type, lambda {|types| where(:type_str => types)} 

그런 다음을 통해 액세스 할 수 있습니다

my_course = Course.first 
my_course.course_users.of_type([:mentor, :enrollee]) 
+0

이것은 우리가 찾고 있었던 것과 정확히 일치합니다. 어떻게이 두포 밑에서 작동합니까? 하나의 DB 요청이 만들어 졌는가 아니면 n 개의 다른 관계에 대해 n인가? –

+0

오류가 발생했습니다 : # 에 대한 정의되지 않은 메서드 'of_type' 아이디어가 있습니까? –

+0

좋아요, 다소 정렬했습니다. 나는 관계라고 불리는 관계를 통해 다른 것을 사용하고있었습니다 : course_users와 조인 테이블. 이제 코드에서 릴레이션 (사용자)의 다른쪽에있는 모델이 아니라 조인 모델의 객체를 반환합니다. 어떻게해야합니까? –

관련 문제