如何通过Rails上的条目数获取具有确切has_many的记录

时间:2018-12-19 15:48:24

标签: ruby-on-rails activerecord

我通过has_many通过

建立了多对多关系
unedit

我怎样才能得到只有一本书的人?

2 个答案:

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