💰

一括購入(Lump Sum)のスケジューリング

2021/01/13に公開

こちらAmetaです。
カート機能でセッションに保存されている選択された商品をまとめて決済する機能。

"Lump Sum Function"

これを実装していく中で重要だと思ったポイントをここにまとめます。

クラスメソッド

# models/order_detail.rb

...
  def self.create_items(order, line_items)
    line_items.target.each do |item|
      OrderDetail.create!(
        order_id: order.id, dish_id: item[:dish_id], quantity: item[:quantity]
      )
      LineItem.find(item[:id]).delete
    end
  end
...

クラスメソッドself.create_itemsを定義しました。
カート機能で保存した商品にオーダーのidを追加して"Order_detail"のレコードを生成。
その後、カートにある"line_item"のレコードを削除。

# controllers/orders_controller.rb

...
  def create
    @order = Order.new(set_params)
    if @order.valid?
      pay_dish
      @order.save
      OrderDetail.create_items(@order, @cart.line_items)
      redirect_to root_path
    else
      render :new
    end
  end
...
  

先ほどのクラスメソッドを呼び出します。

OrderDetail.create_items(@order, @cart.line_items)

@cartはインスタンス変数として共通なので、"line_item"のレコードを削除する必要がある。

アソシエーション

before(単品購入)

  belongs_to :dish

これだけ、必要なのはdish_idのみ。

after(一括購入)

  # models/order.rb
  
  has_many :dishes, through: :order_details
  has_many :order_details, dependent: :destroy

order_detailsは中間テーブルとしてorderに依存。
それぞれのdishに関する情報をorder_idと一緒に保管。

Summary Of The Day (SOTD)

アソシエーションの変更をしていなかった事で、単品購入の時に作動するはずだったエラーメッセージ が現れてしまいました。

"〜 must exist."のようなエラーメッセージはモデルのアソシエーションに関するもの。

今日の学びです。。

Discussion