0

假设我有两个具有 HABTM 关系的模型。师生。这是我目前正在工作的示例:

student_ids = [1,2,3,4]

Teacher.joins(:students).where("students.id" => student_ids)

问题是这将返回所有具有这些学生 id 的所有 Teacher 对象,但不需要所有这些对象:

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 OR 2 OR 3 OR 4 的教师。另一种是 AND,我需要确保返回的教师包括所有 student_id,因此 Student.id 为 1 AND 2 AND 3 AND 4 的教师。

4

2 回答 2

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
于 2013-02-28T17:00:35.620 回答
0

我会使用包含

这里的例子:

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

你可以在这里读更多关于它的内容

http://guides.rubyonrails.org/active_record_querying.html

于 2013-02-28T15:04:22.327 回答