在没有关系的情况下加入表

时间:2019-07-02 04:56:41

标签: sql ruby-on-rails ruby-on-rails-3

无法在没有关系的表上使用joins怎么办?

例如:

class Student
end

class Lesson
end

Student和Lesson之间没有明确的关联,但是,在DB中,我们具有隐式关联:students.lesson_id和lessons.id。

使用纯SQL可以连接这两个表,但是可以使用如下所示的rails提供的joins

Student.joins(:lesson).where('student.lesson_id=lesson.id')

会抛出“在Student上找不到名为“课程”的协会;也许您拼错了?”

我正在寻找符合以下要求的解决方案:

  • 为了提高效率,使用RDBMS查询将是理想的选择。 (无法排序rails,找不到等)
  • 为了提高可读性,原始SQL并不理想。

周围有什么工作吗?谢谢!

2 个答案:

答案 0 :(得分:2)

:lesson中的

joins(:lesson)必须是Student模型中定义的关系的名称:

class Student < ApplicationRecord
  belongs_to :lesson
end

然后,您可以将查询重写为:

Student.joins(:lesson).all

但是如果您需要访问Lesson,此驱动器会进行N + 1个查询:

students = Student.joins(:lesson).all
lesson_name = students.first.lesson.name

为避免这种情况,请改用includes

Student.includes(:lesson).all

您可以(应该)将对应关系添加到Lesson

class Lesson < ApplicationRecord
  has_many :students
end

顺便说一句,您可以在连接中使用字符串:

Student.joins('join lessons on students.lesson_id = lessons.id')

答案 1 :(得分:-1)

活动记录方法.joins已加入外键。无需在where语句中再次指定它。您可以使用where来过滤接收到的结果。