代码之家  ›  专栏  ›  技术社区  ›  pzin

对订单中的商品进行分组和计数

  •  9
  • pzin  · 技术社区  · 6 年前

    我有这三种型号:

    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_id units 项目模型上的字段。

    我看到过解决方案,但仅限于两张表(order>product)的情况,而不是三张表(order>item>product)的情况。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Tom    6 年前

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

    然后 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), ...} 分别针对订单中的每个产品。

        2
  •  2
  •   xploshioOn    6 年前

    在这种特定的情况下,您可以直接要求项目而不是订单,它可以简化事情,只使用2个表而不是3个表。

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