首页 > 解决方案 > 如果调用组子句,则将忽略不同的子句

问题描述

对于LineItem模型,我得到每个行项目的订单数量总和。在此示例中,为简洁起见,我只选择了一个行项目。

查询:

LineItem
  .where(product_id: 14)
  .includes(:order, :product)
  .where(orders: { order_type: 1, order_date: (Date.today - 1.week)..Time.now})
  .sum(:order_quantity)

这会产生

=> 88

这是不准确的。提取 LineItem id 向我展示了一些行项目被多次查询:

LineItem
  .where(product_id: 14)
  .includes(:order, :product)
  .where(orders: { order_type: 1, order_date: (Date.today - 1.week)..Time.now})
  .pluck(:id)

很多重复(仍然没有弄清楚为什么会发生这种情况):

=> [20330, 20330, 20358, 20358, 20361, 20361, 20363, 20363, 20369, 20405, 20405, 20452, 20452, 20513, 20513, 20513, 20527]

好的,所以让我们清楚地称呼它们......

LineItem
  .distinct
  .where(product_id: 14)
  .includes(:order, :product)
  .where(orders: { order_type: 1, order_date: (Date.today - 1.week)..Time.now})
  .sum(:order_quantity)

这会产生

=> 27

这是准确的。由于我还试图将多个 Line Items 拉入一个哈希中,因此我需要在查询结束时调用一个 group 子句;这就是问题开始的地方:

LineItem
  .distinct
  .where(product_id: 14)
  .includes(:order, :product)
  .where(orders: { order_type: 1, order_date: (Date.today - 1.week)..Time.now})
  .group('products.model_number')
  .sum(:order_quantity)

现在即使.distinct被调用,它也恢复到提取重复的行项目:

=> {"LBP8652"=>88}

我在这里遗漏了一些明显的东西吗?我试图.distinct在查询中的其他地方扔掉它,但它仍然给出了同样不准确的结果。

标签: ruby-on-railsrubypostgresqlactiverecord

解决方案


推荐阅读