我有以下表格:
products.rb
# has_many :sales
+----+----------+----------+-------+
| id | name | quantity | price |
+----+----------+----------+-------+
| 1 | Pencil | 30 | 1.0 |
| 2 | Pen | 50 | 1.5 |
| 3 | Notebook | 100 | 2.0 |
+----+----------+----------+-------+
sales.rb
# belongs_to :product
+----+----------+------------+
| id | quantity | product_id |
+----+----------+------------+
| 1 | 10 | 1 |
| 2 | 2 | 1 |
| 3 | 5 | 1 |
| 4 | 2 | 2 |
| 5 | 10 | 2 |
+----+----------+------------+
首先,我想知道我剩下多少件物品,无论其类型如何。答案当然是151,但那是作弊。我可以简单地单独对两个表进行求和,然后将它们放在一起以便知道最终的数字,但我想知道是否可以通过单个命令中的activerecord完成。
我尝试了以下内容:
Product.includes(:sales).group('products.id').sum('products.quantity - sales.quantity')
但我明白了:
=> {1=>73, 2=>88, 3=>0}
这是可以理解的,因为每个人都要这样做:
+-------------------+----------------+-----+
| products.quantity | sales.quantity | sum |
+-------------------+----------------+-----+
| 30 | 10 | 20 |
| 30 | 2 | 28 |
| 30 | 5 | 25 |
+-------------------+----------------+-----+
等于73。
无论如何,如何使用ActiveRecord实现这一目标?我想知道项目的总数,但我也想知道每种类型的总数。
答案 0 :(得分:0)
我不熟悉任何ActiveRecord
方式来实现你想要的东西,但你可以尝试在那里混合一个小的
Product
.group('products.id')
.sum('products.quantity - (SELECT SUM(sales.quantity) AS sales_quantity FROM sales WHERE sales.product_id = products.id)')