首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更深入地了解ActiveRecord

更深入地了解ActiveRecord
EN

Stack Overflow用户
提问于 2013-11-10 22:32:55
回答 1查看 45关注 0票数 1

我会试着从头开始解释我的疑虑。我有以下表格:

代码语言:javascript
复制
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 |
+----+-------------------------+-------------------------+
代码语言:javascript
复制
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        |
+----+------------+---------+-------------------------+-------------------------+----------+

我执行以下语句:

代码语言:javascript
复制
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)时,疑虑出现了

我遵循了以下步骤:

代码语言:javascript
复制
cart = Cart.find(2)
items = cart.line_items.group(:product_id)

我得到了:

代码语言:javascript
复制
+----+------------+---------+-------------------------+-------------------------+----------+
| 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交互时,我都会与数据库交互?我有点困惑了。

EN

回答 1

Stack Overflow用户

发布于 2013-11-10 23:28:45

问得好。:-)

items是一个表示查询的ActiveRecord::Relation。并不是所有对该对象的操作都会导致另一个数据库操作,但有些确实会。例如,lengthto_a不会再次访问数据库,但count会。

关系也是“可链接的”,所以当你调用items.sum(:quantity)时,它会构建一个新的关系。换句话说,关系既可以被认为是查询,也可以被认为是执行该查询的结果。当您链接方法时,实际上是对查询组件进行操作,而不是对中间结果进行操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19890910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档