💡

【Rails】製作ステータスと注文ステータスの紐づけ

2023/10/25に公開

ECサイトの注文履歴詳細にある製作ステータスと注文ステータスの紐づけについて復習したいと思います。

完成目標

①製作ステータスを1つ「製作中」にしたときに、注文ステータスが「製作中」に更新される

②製作ステータスを全て「製作完了」にしたときに、注文ステータスが「発送準備中」に更新される

前提条件

  • ルーティング実装済み
  • ビュー作成済み
  • enum実装済み

コントローラー記述

コントローラ内にif文とeach文を作成する

order_details_controller
class Admin::OrderDetailsController < ApplicationController
  
  def update
    @order_detail = OrderDetail.find(params[:id])
    @order_detail.update(making_status: params[:order_detail][:making_status])
    order = @order_detail.order
    if params[:order_detail][:making_status] == "in_making"
       order.update(status:"making")
    end
    
    if is_all_order_details_making_completed(order)
      order.update(status: 'shipping_in_process')
    end  
    
    flash[:notice] = "更新に成功しました。"
    redirect_to admin_order_path(@order_detail.order.id)
  end
  
  private
  
  def order_detail_params
    params.require(:order_detail).permit(:making_status)
  end
  
  def is_all_order_details_making_completed(order)
    order.order_details.each do |order_detail|
      if order_detail.making_status != 'making_completed'
        return false 
      end
    end
    return true 
  end  
end

上記コントローラ記述で@order_detail = OrderDetail.find(params[:id])@order_detail.update(making_status: params[:order_detail][:making_status])order = @order_detail.orderの3点を定義する。

製作ステータスを1つ「製作中」にしたときに、注文ステータスが「製作中」に更新される

if params[:order_detail][:making_status] == "in_making"
   order.update(status:"making")
end

if params[:order_detail][:making_status] == "in_making"
上記の文で、前の画面で「製作中」が選択されたならを定義し、
order.update(status: 'shipping_in_process')
上記の文で対応するOrderの注文ステータスを「製作中」に更新するという意味になります。

byebugでparams内を確認するとorder_detail=>{"making_status"=>"waiting_for_making"}
という記述がみつかりました。こちらが前の画面から渡された情報になります。
この情報をparams[:order_detail][:making_status] == "in_making"という形であらわすことができます。

製作ステータスを全て「製作完了」にしたときに、注文ステータスが「発送準備中」に更新される

if is_all_order_details_making_completed(order)
   order.update(status: 'shipping_in_process')
end  

if is_all_order_details_making_completed(order)こちらの記述で製作ステータスを全て「製作完了」にしたときというのを表しますがこちらの表し方はストロングパラメータ内のeach文で抽出されます。

:
private
:
def is_all_order_details_making_completed(order)
    order.order_details.each do |order_detail|
      if order_detail.making_status != 'making_completed'
        return false 
      end
    end
   return true 
end  

上記のeach文を解説すると上からorder.order_details.each do |order_detail|の記述で
order_detailひとつひとつのmaking_statusを判定し、if order_detail.making_status != 'making_completed'で一つでもmaking_statusがmaking_completedでなければ、return falseとなり、ここで処理が終了になります。
上記の記述で全てが製作完了になるまで処理が続けられ、全てのorder_detailのmaking_statusがmaking_conmpletedになった際に下のreturn trueで返されます。

そして、updateアクションに戻りorder.update(status: 'shipping_in_process')で注文ステータスが「発送準備中」に更新される仕組みとなります。

each文の中にif文が入ったりと少し複雑ではありますが以上が製作ステータスと注文ステータスの紐づけになります。

今回はチームメイトの助けもありできましたが、来月以降も考慮し1人でもeach文とif文を定義できるように頑張ります!
いや~、難しい!笑

Discussion