Sql Rails中的HABTM关联:收集和统计模型的类别';孩子们

Sql Rails中的HABTM关联:收集和统计模型的类别';孩子们,sql,ruby-on-rails,ruby-on-rails-4,activerecord,Sql,Ruby On Rails,Ruby On Rails 4,Activerecord,我有一个has\u和\u属于\u多个关系设置。看起来是这样的: 书籍有很多类别,而且属于很多类别 类别有很多书,而且属于很多书 一家商店有许多书 一本书属于一家商店 我试图显示每个商店中有多少书属于每个类别。所以我的观点是X店有200本书,其中80本是神秘的,60本是非小说的,等等 我一直在尝试各种不同的方法,但到目前为止都没有成功。我想我是从错误的地方开始的。任何方向都将不胜感激 谢谢 顺便说一句,这是Rails 4和psql。通常,与其使用Rails的“内置”has\u和“属于”多个方法

我有一个
has\u和\u属于\u多个
关系设置。看起来是这样的:

  • 书籍
    有很多类别,而且属于很多类别
  • 类别
    有很多书,而且属于很多书
  • 一家商店有许多书
  • 一本书属于一家商店
我试图显示每个商店中有多少书属于每个类别。所以我的观点是X店有200本书,其中80本是神秘的,60本是非小说的,等等

我一直在尝试各种不同的方法,但到目前为止都没有成功。我想我是从错误的地方开始的。任何方向都将不胜感激

谢谢


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

通常,与其使用Rails的“内置”has\u和“属于”多个方法,不如使用联接表。在此设置中,您有三个表:

  • 类别
  • 图书类别
BookCategories(或任何您决定称之为BookCategories的名称)是一个联接表,它同时属于书籍和类别,并且具有各自的外部ID。然后使用Rails的“has_many:through”链接书籍和类别

这家商店与书籍有着“很多”的关系。在“优先关系”设置正确的情况下,您可以使用此方法获取特定类别的存储计数:

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

如果您有一个
books\u categories
join表,您可以添加一个
has\u many:categories,through::books
关联,链接
存储
categories
through
books

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

提供,谢谢。这似乎让我离得更近了。但是当我尝试使用这个方法时,我得到了这个错误:PG::UndefinedColumn:error:column books.category不存在,这是因为在模型中,关系被定义为有很多:categories,所以它不能识别“category”?这个答案非常混乱。设置
has\u和\u belish\u to \u many
关系也需要一个联接表。你还会把协会存放在哪里?你的
已经走上了正确的道路:通过
但是关于这个答案的其他一切都很糟糕。就是这样。非常感谢你!非常好的解决方案。我创建了一个分支问题,看看哪里有更有效的方法来完成任务。来自@jakub kosiński的修订答案及解决方案
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