質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

0回答

1144閲覧

ecサイト、注文データ保存の仕方、考え方

takeke

総合スコア60

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2018/04/29 07:21

現在ecサイトを作成しているのですが、注文した際のデータの保存の方法が分からないないので、考え方やアドバイスなどいただければと思い質問させていただいたおります。

やっていることは商品をカートに入れてそこから注文画面にいき、必要情報を入力し、不備がなければ送信。注文完了でメールが届き、その後、注文した内容を確認できるというものです。

そこで確認したところ、注文の情報にはいくつか商品がある中の1つしか保存されていないことに気づきました。色々試したのですが複数データを保存するやり方がわかりませんでした。

色々と調べているうちに1つのカラムに複数のデータを保存すること自体が無理だったのと思い至り、新たにorder_itemsというテーブルをつくり、これに商品のidとその注文数をカラムで持たせました。

そこで質問なのですが、カートの中の商品(line_items)を注文確定時に(order_items)としてordersテーブルに保存するにはどうすればいいでしょうか?

とりあえずテーブルとカラムとオーダーコントローラ載せます
schema.rb

ActiveRecord::Schema.define(version: 20180427024132) do create_table "carts", force: :cascade do |t| t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "line_items", force: :cascade do |t| t.integer "product_id" t.integer "cart_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "quantity", default: 1 t.integer "order_id" end create_table "orders", force: :cascade do |t| t.string "name" t.text "address" t.string "email" t.string "pay_type" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "user_id" t.integer "product_id" t.integer "quantity" end create_table "order_items", force: :cascade do |t| t.integer "product_id" t.integer "quantity" t.datetime "created_at", null: false t.datetime "updated_at", null: false create_table "products", force: :cascade do |t| t.string "title" t.text "description" t.string "image_url" t.decimal "price", precision: 8, scale: 2 t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "category_id" end create_table "users", force: :cascade do |t| t.string "name" t.string "password_digest" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "email" t.string "reset_digest" t.datetime "reset_sent_at" end end
class OrdersController < ApplicationController skip_before_action :authorize, only: [:new, :create] before_action :authenticate def new @cart = current_cart if @cart.line_items.empty? redirect_to store_url, notice: "カートは空です" return end @order = Order.new respond_to do |format| format.html format.json { render json: @order } end end def create @order = params[:order].permit(:name, :address, :email, :pay_type,:user_id, :product_id, :quantity) @example = Order.new(@order) @example.add_line_items_from_cart(current_cart) respond_to do |format| if @example.save Cart.destroy(session[:cart_id]) session[:cart_id] = nil OrderNotifierMailer.received(@example).deliver # binding.pry format.html {redirect_to store_url, notice: 'ご注文ありがとうございます^^'} format.json { render json: @order, status: :created, location: @order} else @cart = current_cart format.html {render action: "new"} @order = @example format.json {render json: @order.errors, status: :unprocessable_entity} end end end end

以上なのですが、新たに作ったordersにorder_itemsを保存しようとすると、これまた複数なので無理そうです。そもそもordersにorder_items保存する必要はなくて、order_itemsにorder_idを持たせた方が良さそうな気がしてきました。しかし、その場合注文の情報の出し方がよくわかりません。

以上です。このような質問で申し訳ないのですが、ヒントやアドバイスなど少しでも解決の糸口を頂きたいです。よろしくお願いいたしますm(._.)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/29 13:34

「そこで質問なのですが」まで読んだ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問