はじめに
本記事は、 駆け出しエンジニアの第一歩!AdventCalendar2020 4日目の記事です。
この記事では、注文・カート機能を実装する上で欠かせないER図の考え方について、自分が理解できなかったことをまとめてみました。
Railsを学習し始めて3ヶ月で、まだまだ理解が浅い部分があると思いますが、もし間違っているところ等ありましたら、ご指摘いただけると幸いです。
対象
・注文・カート機能にはどんなテーブルが必要なのか分からない人
・それぞれのテーブルの役割が分からない人
概要
ご紹介する注文機能の基本的な流れは、通販と同様ですが、商品をカートに入れる → 注文情報を入力する → 注文確定する、です。
それぞれの工程で自分が分からなかったことについて、解説します。
1. カートに商品を入れる
1-1.カートテーブルの成り立ち
まず、通販というのはユーザーが商品を購入する行為をおこなう場所です。そのため、どのユーザーがどんな商品を購入するのか、という風にユーザーと商品の間で関係性を持たせることが必要になります。しかし、ユーザーテーブルと商品テーブルは直接結ぶことができません。なぜなら、ユーザーはどの商品にも関係性がないからです。直接結び付けられる例として、ユーザーとブログの関係が挙げられます。
でも、ユーザーと商品を関連づけなければ、商品を買うことはできません。そこで、ユーザーと商品の間を取り持つテーブルが必要になってきます(ここではカートテーブルとします)。カートテーブルは、ユーザーと商品を結びつける上で必然的に発生した中間テーブルです。
1-2. カートとは?
カートを理解するには、まず1つのカートは複数種類の商品をいっぱい入れておけるもの、というイメージを捨てましょう。上記のER図のカートをよく見ると、カートID1つに対して、商品IDやユーザーIDはそれぞれ1つずつ対応しています。なので、1つのカートには、1種類の商品が入ります。
2. 注文情報を入力する
2-1. 注文テーブルに商品情報を直接入れる
注文情報の入力では、主に配送先住所、送料、支払い方法などを決定します。ここで注意したいのが、商品も注文情報の一部だからという考えから、注文テーブルの中に商品を入れてしまわないことです。
2-2. 注文テーブルと商品テーブルを直接関連づける
注文テーブルと商品テーブルを直接関連づければいいという考えから、以下のようにしてみるのもよくありません。よくない点は、いくつかありますが、一例をあげると、サイト管理者が商品を登録する際に、注文idを設定しいなければいけないことです。注文idは、注文が完了した後に、事後的に決定するものであり、サイト管理者が事前に設定するのは、少しおかしな話です。
そこで、注文テーブルと商品テーブルを結びつけるためには、間に中間テーブル(注文詳細テーブル)を作る必要があります。
3. 注文確定ボタンをクリックする
カートと注文の仕組みについて解説してきましたが、この2つのテーブル同士の関係はまだありません。しかし、結論から言うと関係づけるというよりは、カートの情報を注文詳細へ移動させるということです。
カートの情報は、移動後に削除されるようにすれば、注文確定後にカート内は空にできます。通販でも注文確定後のカート内は、空になっていますよね。カートと注文詳細の決定的な違いは、注文が未確定のものか確定済みのものかということです。
まとめ
自分は当初この仕組みが全く理解できていませんでした。初学者の方で理解に苦しんでいる人の力に少しでもなったら幸いです。