Sql 对多个父记录的子记录的属性进行求和操作

Sql 对多个父记录的子记录的属性进行求和操作,sql,ruby-on-rails,ruby,activerecord,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 def self.available 可用=[] P

我在我的产品模型中有这样一种方法,可以满足我的需要:

def self.available
  available = []
  Product.all.each do |product|
    if product.quantity > product.sales.sum(:quantity)
      available << product
    end
  end
  return available
end
def self.available
可用=[]
Product.all.each do|产品|
如果product.quantity>product.sales.sum(:数量)

可用这将创建一系列查询,其数量等于由于
sum
查询而产生的产品数量。我想到了一种减少数据库查询的方法

map = Sale.joins(:product)
  .group("products.id", "products.quantity").sum(:quantity).to_a
这将产生一个类似于

[[[1,20],30], [[2,45], 20]]
这对应于
[[product\u id,product\u quantity],salled\u quantity]]

现在循环这个数组并比较值

available = []
map.each do |item|
  if item[0][1] > item[1]
    available << item[0][0]
  end
end
现在,您在两个查询中得到了相同的输出,而不是
Product.count(N)
查询数。此解决方案有时效率低下,但如果我有任何想法,我会定期更新它。

您可以尝试:

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