1

私の疑問を最初から説明してみます。次のテーブルがあります。

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        |
+----+------------+---------+-------------------------+-------------------------+----------+

そして最後に実行したところ、驚いたことに、オブジェクト ( )に対して実行した場合に、各製品 ID に対して 3 に等しい数量を取得する方法を理解できないため、items.sum(:quantity)再び疑問が生じました。 2 行のみで、それぞれの数量は 1 です。 何を記憶しますか? または SQL 文字列から取得したオブジェクトは、データベースと対話するたびに対話することを意味しますか? 少し混乱しています。=> {2=>3, 5=>3}
sumitems
itemscart.line_items.group(:product_id)items

4

1 に答える 1

3

良い質問です。:-)

itemsクエリをActiveRecord::Relation表す です。そのオブジェクトに対するすべての操作が別のデータベース操作になるわけではありませんが、そうなる場合もあります。たとえば、データベースに再度アクセスlengthto_aませんが、アクセスしますcount

リレーションも「連鎖可能」であるため、呼び出すと新しいitems.sum(:quantity)リレーションが構築されます。つまり、リレーションはクエリとそのクエリの実行結果の両方と考えることができます。メソッドを連鎖させると、実際には中間結果ではなく、クエリ コンポーネントを操作することになります。

于 2013-11-10T15:28:45.170 に答える