Rails中的HABTM关联:收集和计算模型子项的类别

时间:2015-05-08 18:18:32

标签: sql ruby-on-rails ruby-on-rails-4 activerecord

我有has_and_belongs_to_many关系设置。它看起来像这样:

  • 图书have_and_belong_to_many类别
  • 类别have_and_belongs_to_many图书
  • 商店has_many本书
  • 一本书belongs_to商店

我试图显示每个商店中有多少本书属于每个类别。因此,我的观点将显示商店X有200本书,其中80本是神秘的,60本是非小说类等。

我一直在尝试一些不同的方法来做到这一点,但到目前为止还没有成功。我想我是从错误的地方开始的。任何方向都会非常感激。

由于

顺便说一下,这是Rails 4和psql。

2 个答案:

答案 0 :(得分:2)

通常,不使用Rails的内置“has_and_belongs_to_many”方法,最好使用连接表。在此设置中,您有三个表:

  • 图书
  • 分类
  • BookCategories

BookCategories(或您决定称之为的任何内容)是一个连接表,属于Books和Categories,并且每个都有一个外来ID。然后,您将使用Rails的“has_many:through”链接书籍和类别。

商店与书籍之间存在'has_many'关系。通过先前的关系设置,您可以使用此方法获取特定类别的商店的计数:

Store.books.where(category:'Mystery')

答案 1 :(得分:2)

如果您有一个books_categories联接表,则可以添加一个has_many :categories, through: :books关联,链接storescategoriesbooks

class Store < ActiveRecord::Base
  has_many :books
  has_many :categories, through: :books
end

这很容易。现在让我们为每个类别和书籍计数(修订):

def books_per_category
  categories.select('categories.id, categories.name, count(books.id) as count').group('categories.id, categories.name').map do |c|
    {
      name: c.name,
      count: c.count
    }
  end
end

@jakub-kosiński提供