我的产品模型中有这种方法可以满足我的需求:
def self.available
available = []
Product.all.each do |product|
if product.quantity > product.sales.sum(:quantity)
available << product
end
end
return available
end
但是,我想知道是否有更有效的方法来执行此操作,可能只需要调用一次数据库。
答案 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)
个查询数。这个解决方案有时会效率低下,但如果我有任何想法,我会定期更新它。