我有以下三种模型:
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)的情况下。
答案 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)')