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

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

ただいまの
回答率

90.48%

  • Ruby

    7939questions

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

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

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 132

takeke

score 38

現在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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/04/29 22:34

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

    キャンセル

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

関連した質問

  • 解決済

    Ruby on railsでのJSONについて教えてください

    **JSONについて教えてください。 ** 現在Ruby on railsを勉強しているのですが、その中でJSONという言葉が出てきました。 ネットで調べたところ下記の内容は把

  • 受付中

    activerecordで取得したデータに新しいカラムを追加したい

    findなどで取得したデータに対してカラムを追加したいです @article = Article.where(id: 1) @articleの中にはid,nameがある

  • 解決済

    rails ActiveRecordのselect内で自作メソッドを使う方法はあるか?

    railsでActiveRecordのselect内でstrftimeを使うことができますが、自作したメソッドを使う方法はあるでしょうか? 以下のようにしたらエラーになりました。

  • 解決済

    Railsで`accepts_nested_attributes_for`と`fields_for`...

    Railsでaccepts_nested_attributes_forとfields_forを使ってhas_many関連の子レコードを作成/更新するフォームの作成例は多くみかけます

  • 受付中

    モデルにvalidatesをつけない方法

    モデルにvalidatesをつけない方法はあるのでしょうか? 現在postモデルにcategoryモデルを紐付けております。 post投稿時にcategoryをcate

  • 解決済

    mysql テーブル作成

    mysqlについて学んでいるのですが初心者すぎてよくわからなくて ネットには、 ”テスト用としてデータベースの準備をしていきます。ここではMAMPを使用しデータを入力していきま

  • 解決済

    fields_forでうまくデータが保存されません

    Rails初心者です。 動作がうまくいかず悩み続けています・・・どうかご助力下さい... form_withとfields_forを用いてメッセージと画像を別のモデルに保存して

  • 解決済

    rails validateについて

     前提・実現したいこと 投稿の際に昨日以前に日付設定した場合に投稿できないように機能を実装したい。 railsで指定した日付以降に開ける投稿アプリを作っています。 上記の機能を

同じタグがついた質問を見る

  • Ruby

    7939questions

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