我会试着从头开始解释我的疑虑。我有以下表格:
carts
+----+-------------------------+-------------------------+
| id | created_at | updated_at |
+----+-------------------------+-------------------------+
| 1 | 2013-11-09 12:57:37 UTC | 2013-11-09 12:57:37 UTC |
| 2 | 2013-11-10 11:33:25 UTC | 2013-11-10 11:33:25 UTC |
| 3 | 2013-11-10 12:16:25 UTC | 2013-11-10 12:16:25 UTC |
+----+-------------------------+-------------------------+line_items
+----+------------+---------+-------------------------+-------------------------+----------+
| id | product_id | cart_id | created_at | updated_at | quantity |
+----+------------+---------+-------------------------+-------------------------+----------+
| 1 | 2 | 2 | 2013-11-10 11:33:25 UTC | 2013-11-10 11:33:25 UTC | 1 |
| 2 | 2 | 2 | 2013-11-10 11:45:26 UTC | 2013-11-10 11:45:26 UTC | 1 |
| 3 | 5 | 2 | 2013-11-10 11:46:06 UTC | 2013-11-10 11:46:06 UTC | 1 |
| 4 | 2 | 2 | 2013-11-10 12:08:41 UTC | 2013-11-10 12:08:41 UTC | 1 |
| 5 | 5 | 2 | 2013-11-10 12:09:03 UTC | 2013-11-10 12:09:03 UTC | 1 |
| 6 | 5 | 2 | 2013-11-10 12:15:48 UTC | 2013-11-10 12:15:48 UTC | 1 |
| 7 | 2 | 3 | 2013-11-10 12:16:26 UTC | 2013-11-10 12:16:26 UTC | 1 |
| 8 | 2 | 3 | 2013-11-10 12:29:21 UTC | 2013-11-10 12:29:21 UTC | 1 |
+----+------------+---------+-------------------------+-------------------------+----------+我执行以下语句:
cart = Cart.find(2)
sums = cart.line_items.group(:product_id).sum(:quantity)结果如下:=> {2=>3, 5=>3}
到目前为止,我不得不说,这对我来说似乎是非常清楚的,那就是,我根据产品id计算乘积的和,然后折叠相同的产品。
后来,当我试图分解指令cart.line_items.group(:product_id).sum(:quantity)时,疑虑出现了
我遵循了以下步骤:
cart = Cart.find(2)
items = cart.line_items.group(:product_id)我得到了:
+----+------------+---------+-------------------------+-------------------------+----------+
| id | product_id | cart_id | created_at | updated_at | quantity |
+----+------------+---------+-------------------------+-------------------------+----------+
| 4 | 2 | 2 | 2013-11-10 12:08:41 UTC | 2013-11-10 12:08:41 UTC | 1 |
| 6 | 5 | 2 | 2013-11-10 12:15:48 UTC | 2013-11-10 12:15:48 UTC | 1 |
+----+------------+---------+-------------------------+-------------------------+----------+最后,我执行了items.sum(:quantity),令我惊讶的是,我又得到了=> {2=>3, 5=>3}
我产生了疑问,因为我不能理解,如果我在一个只包含2行的对象(items)上执行sum,每个产品id的数量是1,我怎么能得到数量等于3的数量。
items记住了什么?从cart.line_items.group(:product_id)或SQL string获得的对象,这意味着每次我与items交互时,我都会与数据库交互?我有点困惑了。
发布于 2013-11-10 23:28:45
问得好。:-)
items是一个表示查询的ActiveRecord::Relation。并不是所有对该对象的操作都会导致另一个数据库操作,但有些确实会。例如,length和to_a不会再次访问数据库,但count会。
关系也是“可链接的”,所以当你调用items.sum(:quantity)时,它会构建一个新的关系。换句话说,关系既可以被认为是查询,也可以被认为是执行该查询的结果。当您链接方法时,实际上是对查询组件进行操作,而不是对中间结果进行操作。
https://stackoverflow.com/questions/19890910
复制相似问题