我通过has_many通过
建立了多对多关系unedit
我怎样才能得到只有一本书的人?
答案 0 :(得分:1)
如果Person
的表称为persons
,则可以使用ActiveRecord的查询DSL构建适当的SQL查询:
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)
答案 1 :(得分:0)
如果这是您经常要做的事情,Rails提供了一个counter cache:
:counter_cache选项可用于更高效地查找附属对象的数量。
使用此声明,Rails将使缓存值保持最新,然后响应size方法返回该值。
有效地,这会在您的Person
上放置一个名为books_count
的新属性,使您可以非常简单地按关联书的数量进行过滤:
Person.where(books_count: 1)