0

HABTM 関係を持つ 2 つのモデルがあるとします。教師と生徒。これが私が現在取り組んでいるものの例です:

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)

2 つのケースがあり、そのうちの 1 つは OR 条件です。Student.id が 1 OR 2 OR 3 OR 4 の教師を見つける必要があるだけなので、上記は問題なく処理できます。もう 1 つは AND です。返される教師にはすべての Student_ids が含まれているため、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 に答える