2011-04-26 43 views
1

當我在rails應用程序中爲自己的ruby黑客攻擊自己的SQL時,我有點不解,所以你的幫助將非常感謝。我有一個模型,如下所示:Rails或SQL來通過幾個模型協會

Timetable 
    has_many :enrollments 

Enrollment 
    belongs_to :timetable 
    belongs_to :stream 
    has_one :course, :through => stream 
    #Stream & Timetable together are unique for an Enrollment 

Stream 
    has_many :enrollments 
    belongs_to :course 

Course 
    has_many :streams 

Timetable 1-* Enrollments *-1 Stream *-1 Course

我試圖找到一條獲取一組與時間表相關課程的最佳途徑,通過它的入學率,通過每個招生的流,有一門課程。

最好是這樣的:

Timetable.courses 

嘗試以下沒有運氣

Timetable 
    has_many :courses, :through => :enrollments, :source => :course 

它給了我一個錯誤ActiveRecord::HasManyThroughSourceAssociationMacroError: Invalid source reflection macro :has_one :through for has_many :courses, :through => :enrollments. Use :source to specify the source reflection.

我在Invalid source reflection macro :has_many :through接過來一看,它似乎是相當關。

我也發現http://code.alexreisner.com/articles/has-many-through-habtm.html但我不能完全理解如何在這裏應用這個(儘管它是12am NZT,所以也許這就是原因!)。

幫助,提示甚至答案都會很棒!

回答

1

如果我理解正確的話,這是你想要的(例如)的SQL:

SELECT c.* 
FROM courses c 
    LEFT JOIN streams s ON s.course_id = c.id 
    LEFT JOIN enrollments e ON e.stream_id = s.id 
    LEFT JOIN timetables t ON e.timetable_id = t.id 
WHERE t.id = 5 

要在軌道實現這一點,看看

Course.joins(:streams => {:enrollments => :timetables}).to_sql 

這說明你的SQL它產生。然後,您可以應用其他條件,如

Course.joins(:streams => {:enrollments => :timetables}).where(some condition on timetables) 
+0

SQL很好地訣竅!將試圖包圍我的頭繞軌道的方式:)乾杯@mosch! – 2011-04-27 04:39:38

+0

對於任何未來的讀者,我最終添加了'Stream has_many時間表,:through =>:enrollments'。這可以讓我簡單地調用Course.joins(:streams =>:timetables).where(「timetable_id = ** id **」)。group('timetables.id')'獲得給定時間表的一組課程! :) – 2011-04-27 05:03:19