2012-10-29 61 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.enrollees的一個內容,@ course.mentors等,但有時它會方便能夠同時獲得參保和導師一起。

我有許多不同的關聯,這使得爲單個關聯的每個組合創建附加關聯是不切實際的。人們總是可以做

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

然而,這會導致對數據庫的兩個請求和可能重複的條目。

我也調查了關聯的merge函數,但是這只是返回一個空的關係。

什麼是最好的軌道這樣做?

回答

4

您可以簡單地添加到CourseUser一般關聯的課程模型內部:

has_many :course_users 

然後把CourseUser模型內的範圍:

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

然後,您可以通過訪問

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

這是*完美*,正是我們所尋找的東西。儘管如此,這是如何工作的?是否有一個數據庫請求或n個不同的關係? –

+0

現在得到的錯誤:未定義的方法'of_type'爲# 任何想法? –

+0

好吧有點排序它,我用另一個通過關係調用:用戶,而不是關係:course_users到連接表。 現在,您提供的代碼將返回聯接模型的對象,而不是關係(用戶)另一側的模型。我怎樣才能做到這一點? –