Rails SQL Left Join - PullRequest
       6

Rails SQL Left Join

0 голосов
/ 24 октября 2009

Мои модели:

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

Когда я выполняю этот запрос, если есть соответствующая оценка, все в порядке, но если для курса нет соответствующей оценки, даже если он возвращает запись курса, он возвращает ноль для идентификатора курса, поэтому Я озадачен, почему это так. Если я запускаю прямой запрос SQL, он возвращает идентификатор курса для всех курсов, независимо от совпадения оценок. Я использую метод проверки, чтобы увидеть результаты

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

Я также заметил странность в ссылках на оценки, должен ли я использовать единственное или множественное число оценок?

1 Ответ

0 голосов
/ 26 октября 2009

Я полагаю, что проблема связана с вашим заявлением о присоединении.

"and g.user_id = 1" является более условием WHERE, чем условием объединения. Однако в качестве условия выборка не будет захватывать строки, в которых для этого пользователя нет оценки, поэтому вам нужно иметь значение 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...