通过三个关联计数和分组记录

时间:2013-10-16 10:45:48

标签: ruby-on-rails activerecord associations

我有三种模式:

  • 预订[belongs_to:author]
  • 作者[belongs_to:publisher,has_many:books]
  • 出版商[has_many:authors]

我想知道每个发布商有多少本书,按发布商分组,并由发布商按大多数图书订购。我需要获得一个包含单个查询的列表,我可以在其中获得类似的内容:

  • 出版商ABC:3800本书
  • 出版商XYZ:1922本书
  • 出版商JKL:192本书
  • 等等

图书属于作者而不是发布者直接复杂以解释原因。有没有一种简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:0)

使用has_many through定义publisherbooks之间的关系

# publisher.rb

has_many :books, :through => :authors

然后你得到这样的有序计数

records =  Publisher.joins(:books).
                     group("publishers.id").
                     select("publishers.*, COUNT(*) AS books_count").
                     order("books_count DESC")
# => access book count as record.book_count

如果您需要经常访问发布商的图书计数,请考虑在publishers表中添加名为books_count的列(以提高效果)。您可以使用counter cache

进行更新

答案 1 :(得分:0)

这应该有效:

counts = Publisher.joins(:authors => :books).
                   select('publishers.id, count(books.id) as number').
                   group('publishers.id')
# count[0] is now a Publisher object; and counts[0].number is the count of books they own