前提として、、
今回はカートモデルは持たず、カートの商品を中間テーブルとして、商品とユーザーを関連付けています。
注文に関しては、注文モデルと注文商品のモデルを作り、1:nで関連付けさせています。
schema.rb(注文商品のモデル)
create_table "order_items", force: :cascade do |t|
t.integer "order_id"
t.integer "item_id"
t.string "name"
t.integer "price"
t.integer "quantity"
t.integer "production_status"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
orders_controller.rb
def create
@order = current_user.orders.new(order_params)
@order.save
end
カート商品の注文商品への移行は、orders_controller内でできました。
流れとしては、空の@order_itemsを作成し、 order_idとitem_idにそれぞれ、OrderモデルのidとItemモデルのidを代入するという流れになります。
まずは、orderを作成する必要があります。でないと、order_idがないので。
orders_controller.rb
def create
@order = current_user.orders.new(order_params)
@order.save
@cart_items = current_user.cart_items.all
@cart_items.each do |cart_item|
@order_items = @order.order_items.new
@order_items.item_id = cart_item.item.id
@order_items.name = cart_item.item.name
@order_items.price = cart_item.item.price
@order_items.quantity = cart_item.quantity
@order_items.save
end
end
次に、ログインしているユーザーのすべての注文商品をeach分で回し、その中でカラムに一つずつ代入していきます。
気をつけるのは、@order_items.newと@order_items.saveもeach文の中ですることかなと。でないとcart_itemの数だけデータを保存するということができないです。
orders_controller.rb
def create
@order = current_user.orders.new(order_params)
@order.save
@cart_items = current_user.cart_items.all
@cart_items.each do |cart_item|
@order_items = @order.order_items.new
@order_items.item_id = cart_item.item.id
@order_items.name = cart_item.item.name
@order_items.price = cart_item.item.price
@order_items.quantity = cart_item.quantity
@order_items.save
current_user.cart_items.destroy_all
end
end
最後に、注文後はカートが空になる様にしてあげるのも忘れずに。
以上です。初学者なのでまだまだ無駄のあるコードかもしれませんが、参考になればと思います。
もっといい方法があれば、是非教えてください!