对订单项上的产品进行分组和计数

时间:2018-12-04 17:28:35

标签: ruby-on-rails postgresql activerecord

我有以下三种模型:

class Order
  has_many :items
end

class Item
  belongs_to :order
  belongs_to :product
end

class Product
  has_many :orders, through: :items
  has_many :items
end

我需要列出给定日期范围内的订单中每种产品的数量。

我有一个范围来获取日期范围内的所有订单:

Order.date_range(from, to)

现在我需要分组并计数;项目模型上有product_idunits字段。

我看到了解决方案,但仅在有两个表(order> product)但没有三个表(order> item> product)的情况下。

2 个答案:

答案 0 :(得分:3)

您可以将关系has_many :products, through: :items添加到Order模型。

然后Order.date_range(from, to).joins(:products).group(:product_id).count(您也可以执行group('products.id')

如果items.units列并不总是1,并且需要加总,则可以执行以下操作:Order.date_range(from, to).joins(:products).group(:product_id).sum(:units)

返回将分别是订单中每个产品的{product1.id => count(product1.id), ...}{product1.id => sum(units1), ...}的哈希值。

答案 1 :(得分:2)

在这种特定情况下,您可以直接索取物品,而不索取订单,它可以简化事情,只处理2个而不是3个表。

Item.joins(:order).where(orders: {created_at: @from..@to}).group('product_id, category, code').pluck('items.product_id, sum(items.units)')