現在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
あなたの回答
tips
プレビュー