Rails通过连接表获取关联计数

最大限度

这个问题是Rails中HABTM协会的一个分支:收集并计算模型子级的类别

鉴于:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :books
  validates_uniqueness_of :name
end

class Book < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

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

任务:

给定一家商店,列出每个类别的书籍数量。

Store.first.books_per_category

所需的输出:

[ { name: 'mystery', count: 5 }, { name: 'fantasy', count: 6 } ]

但是,每个商店可能都有大量的书籍和类别

我正在尝试创建一个单一的性能查询,该查询只获取与商店相关联的每个不同类别的名称列和书籍数量,而没有将书籍加载到内存中。

到目前为止,我已经尝试过:

class Store < ActiveRecord::Base

  # Will load each book into memory
  def books_per_category
    categories.eager_load(:books).map do |c|
      {
          name: c.name,
          count: c.books.size # Using size instead of count is important since count will always query the DB
      }
    end
  end

  # will query books count for each category.
  def books_per_category2
    categories.distinct.map do |c|
      {
          name: c.name,
          count: c.books.count
      }
    end
  end
end

数据库架构:

ActiveRecord::Schema.define(version: 20150508184514) do

  create_table "books", force: true do |t|
    t.string   "title"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "store_id"
  end

  add_index "books", ["store_id"], name: "index_books_on_store_id"

  create_table "books_categories", id: false, force: true do |t|
    t.integer "book_id",     null: false
    t.integer "category_id", null: false
  end

  add_index "books_categories", ["book_id", "category_id"], name: "index_books_categories_on_book_id_and_category_id"
  add_index "books_categories", ["category_id", "book_id"], name: "index_books_categories_on_category_id_and_book_id"

  create_table "categories", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  create_table "stores", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end
雅库布·科辛斯基(JakubKosiński)

您可以使用chainselectgroup汇总每个类别的图书数量。您的books_per_category方法可能如下所示:

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

这将产生以下SQL查询:

SELECT categories.id, categories.name, count(books.id) as count 
  FROM "categories" 
  INNER JOIN "books_categories" ON "categories"."id" = "books_categories"."category_id" 
  INNER JOIN "books" ON "books_categories"."book_id" = "books"."id" 
  WHERE "books"."store_id" = 1 
  GROUP BY categories.id, categories.name

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails 6:如何删除通过连接表关联的记录而不将其从关联表中删除?

来自分类Dev

通过连接多个表进行计数

来自分类Dev

Rails:连接表并按计数分组

来自分类Dev

如何获取实体框架连接表的计数

来自分类Dev

Rails:获取关联关联

来自分类Dev

Rails ActiveRecord按联接表关联计数排序

来自分类Dev

汇总连接表 Ruby on Rails 中关联的表中的数据

来自分类Dev

通过以下方式处理has_many中的rails中的关联,但是深了两个连接表

来自分类Dev

编写单个Rails活动记录查询以通过与两个表关联来获取所有项?

来自分类Dev

连接两个表,但仅获取最新的关联记录

来自分类Dev

Rails通过另外2个表连接

来自分类Dev

Rails关联:通过控制台访问联接表(HABTM)

来自分类Dev

Rails通过belongs_to关联获取所有对象

来自分类Dev

如何通过Rails中的关联获取详细信息?

来自分类Dev

如何通过Rails中的关联获取详细信息?

来自分类Dev

通过连接表上的计数进行学说搜索

来自分类Dev

通过连接查询后获取“基本”记录数的计数

来自分类Dev

在 Rails 5 中对连接表进行计数和排序

来自分类Dev

Rails活动记录关联:从多个表中获取数据

来自分类Dev

MySQL:连接三个表并获取计数

来自分类Dev

如何获取 3 个表连接中特定列的计数?

来自分类Dev

如果从左连接表中的值不为空,则获取计数

来自分类Dev

查询连接表的计数

来自分类Dev

通过迭代获取计数

来自分类Dev

范围关联元素与连接表

来自分类Dev

如何通过 ServiceStack.OrmLite 获取通过中间表关联的所有对象?

来自分类Dev

通过Rails中的关联3

来自分类Dev

通过Rails中的关联3

来自分类Dev

通过Rails关联查询

Related 相关文章

热门标签

归档