💰
一括購入(Lump Sum)のスケジューリング
こちら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