对多个父记录的子项的属性进行SUM运算

时间:2015-12-01 23:36:45

标签: sql ruby-on-rails ruby activerecord

我的产品模型中有这种方法可以满足我的需求:

def self.available
  available = []
  Product.all.each do |product|
    if product.quantity > product.sales.sum(:quantity)
      available << product
    end
  end
  return available
end

但是,我想知道是否有更有效的方法来执行此操作,可能只需要调用一次数据库。

2 个答案:

答案 0 :(得分:3)

你可以试试:

Product.where("products.quantity > Coalesce((select sum(s.quantity) from sales s where s.product_id = products.id), 0)")

答案 1 :(得分:0)

这会创建一些查询,这些查询等于sum查询所产生的产品数量。这是我可以减少数据库查询的方法。

map = Sale.joins(:product)
  .group("products.id", "products.quantity").sum(:quantity).to_a

这将产生类似于

的数组
[[[1,20],30], [[2,45], 20]]

这对应于[[[product_id, product_quantity], sold_quantity ]]

现在循环遍历此数组并比较值。

available = []
map.each do |item|
  if item[0][1] > item[1]
    available << item[0][0]
  end
end

现在您已填充available数组,请执行另一个查询。

available = Product.where(id: available)

现在,您在两个查询中获得了相同的输出,而不是Product.count (N)个查询数。这个解决方案有时会效率低下,但如果我有任何想法,我会定期更新它。