无法在没有关系的表上使用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上找不到名为“课程”的协会;也许您拼错了?”
我正在寻找符合以下要求的解决方案:
周围有什么工作吗?谢谢!
答案 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
来过滤接收到的结果。