Если таблица для Person
называется persons
, вы можете создать соответствующий SQL-запрос, используя DSL-запрос ActiveRecord:
people_with_book_ids = Person.joins(:books)
.select('persons.id')
.group('persons.id')
.having('COUNT(books.id) = 1')
Person.where(id: people_with_book_ids)
Хотя это две строки кода Rails, ActiveRecord объединит его водин вызов в базу данных.Если вы запустите его в консоли Rails, вы можете увидеть инструкцию SQL, которая выглядит примерно так:
SELECT "persons".* FROM "persons" WHERE "deals"."id" IN
(SELECT persons.id FROM "persons" INNER JOIN "rentals"
ON "rentals"."person_id" = "persons"."id"
INNER JOIN "books" ON "rentals"."book_id" = "books"."id"
GROUP BY persons.id HAVING count(books.id) > 1)