【问题标题】:Rails SQL Left JoinRails SQL 左连接
【发布时间】:2009-10-24 18:36:26
【问题描述】:

我的模型:

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 返回 nil,所以我我很困惑为什么会这样。如果我运行一个直接的 SQL 查询,它会返回所有课程的课程 ID,而不管成绩是否匹配。我正在使用inspect方法查看结果

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

我还注意到在引用成绩时有一个奇怪的地方,我应该使用成绩单数还是复数?

【问题讨论】:

    标签: sql ruby-on-rails


    【解决方案1】:

    我认为问题与您的加入声明有关。

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

    【讨论】:

    • 使用 :conditions 并添加 g.user_id IS NULL 不起作用,它没有选择没有匹配成绩的课程。
    猜你喜欢
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多