假设我有两个具有HABTM关系的模型。师生。以下是我目前工作的一个例子:
student_ids = [1,2,3,4]
Teacher.joins(:students).where("students.id" => student_ids)
问题是,这将返回所有教师对象与任何这些学生ID,但不要求所有这些对象:
SELECT `teachers`.* FROM `teachers` INNER JOIN `students_teachers` ON `students_teachers`.`teacher_id` = `teachers`.`id` INNER JOIN `students` ON `students`.`id` = `students_teachers`.`student_id` WHERE `students`.`id` IN (1, 2, 3, 4)
我有两个案例,其中一个是OR条件,上面处理得很好,因为我只需要找到有Student.id 1或2或3或4的教师。另一个是AND,我需要确保返回的教师包括所有student_ids,因此教师与Student.id 1和2以及3和4。
答案 0 :(得分:0)
我会使用include
这里的例子:
clients = Client.includes(:address).limit(10)
这将会发生:
SELECT * FROM clients LIMIT 10
SELECT addresses.* FROM addresses
WHERE (addresses.client_id IN (1,2,3,4,5,6,7,8,9,10))
你可以在这里阅读更多相关信息
答案 1 :(得分:0)
您可以执行以下操作:
teachers = nil # so it wont be used in the first pass
Student.include(:teachers).where(id: student_ids).each do |student|
teachers = (teachers || s.teachers) & s.teachers
end