如何从两个表中求和两个字段,即使第二个表中的字段可能为空?

时间:2015-05-15 02:08:01

标签: ruby-on-rails ruby-on-rails-4

我有以下表格:

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实现这一目标?我想知道项目的总数,但我也想知道每种类型的总数。

1 个答案:

答案 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)')