2009-10-24 67 views
0

我的模型:Rails的SQL左連接

class Student 
    has_many :grades 
    has_many :courses, :through => :grades 
end 

class Grades 
    belongs_to :student 
    belongs_to :course 
end 

class Course 
    has_many :grades 
    has_many :students, :through => :grades 
end 

在我的視圖頁面,對一個學生,我需要顯示所有的課程和相關的等級(如果有的話)

Student: Joe Blow 
Course   Grade 
Sociology   A 
Biology   B 
Chemistry 
... 

我使用左連接來處理這個查詢

@courses = Course.find(:all, 
    :joins => "as c left join grades g on c.id = g.grade_id and g.user_id = 1", 
    :select => "c.id, c.name, g.grade") 

當我運行此查詢,如果有匹配的檔次,一切都很好,但如果沒有一個匹配等級即使它返回課程記錄,但它返回的課程ID爲零,所以我很困惑爲什麼這樣。如果我運行一個直接的SQL查詢,它將返回所有課程的課程標識,而不考慮年級匹配。我使用的檢查方法看結果

logger.debug @courses.first.inspect + ", " + @courses.first.grade.inspect 

我也注意到在引用級的怪胎,我應該使用級的單數或複數?

回答

0

我相信問題與您的加入聲明有關。

「和g.user_id = 1」更多地是WHERE條件而不是連接詞。但是,作爲條件,select不會爲該用戶沒有評分的行抓取行,所以您需要一個NULL項。

你想更重要的是這樣的:

@courses = Course.find(:all, 
    :joins => "as c left join grades g on c.id = g.grade_id", 
    :conditions => "g.user_id = 1 OR g.user_id IS NULL)", 
    :select => "c.id, c.name, g.grade") 
+0

使用:條件並添加g.user_id IS NULL沒有工作,也沒有不匹配等級拿起課程。 – Bob 2009-10-28 22:41:45