2009-10-24 4 views
0

Mes modèles:Rails SQL gauche Rejoindre

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 

Sur ma page vue, pour un étudiant, je dois montrer tous les cours et les notes associées (le cas échéant)

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

J'utilise une jointure gauche pour traiter cette requête

@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") 

Quand je lance cette requête, s'il y a une note correspondant, tout va bien, mais s'il n'y a pas une note de correspondance pour un cours, même s'il retourne l'enregistrement du cours, il renvoie un zéro pour l'identifiant du cours, donc je suis étonné de savoir pourquoi. Si j'exécute une requête SQL directe, elle renvoie l'identifiant du cours pour tous les cours, quelle que soit la correspondance. J'utilise la méthode inspect pour voir les résultats

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

J'ai aussi remarqué une bizarrerie dans le grade référencement, dois-je utiliser au singulier ou au pluriel de qualité?

Répondre

0

Je crois que le problème a à voir avec votre déclaration de jointure.

"et g.user_id = 1" correspond plus à une condition WHERE qu'à un terme de jointure. Cependant, en tant que condition, le select ne saisira pas les lignes où il n'y a pas de note pour cet utilisateur, vous devez donc utiliser un terme NULL.

Ce que vous voulez est plus comme ceci:

@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

Utilisation: conditions et en ajoutant la g.user_id IS NULL ne fonctionne pas, il n'a pas choisi les cours sans grades correspondant. – Bob