Rails 3 HABTM查询数组,需要AND不是OR / IN

时间:2013-02-28 14:49:38

标签: ruby-on-rails-3 activerecord

假设我有两个具有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。

2 个答案:

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

你可以在这里阅读更多相关信息

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

答案 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