```model/order.rb
class Order < ApplicationRecord
:
has_many :ordered_items
has_many :items, through: :ordered_items
enum status: {"入金待ち":0,"入金確認":1, "製作中":2, "発送準備中":3, "発送済み":4}
:
end
```
```model/ordered_item.rb
class OrderedItem < ApplicationRecord
belongs_to :order
belongs_to :item
enum making_status: {"製作不可":0,"製作待ち":1,"製作中":2,"製作終了":3}
end
```
```ruby:orders.controller.rb
class Admin::OrdersController < ApplicationController
def show
@order = Order.find(params[:id])
@ordered_items = @order.ordered_items
end
# 注文ステータスの更新
def update
@order = Order.find(params[:id]) # ステータス更新ボタンが押された注文データ特定
@ordered_items = @order.ordered_items # 注文商品から注文商品テーブルの呼び出し
@order.update(order_params)# 注文ステータスの更新、更新するカラムはstatus
```ruby:OrderedItemsController
class Admin::OrderedItemsController < ApplicationController
before_action :authenticate_admin! # making_status => 制作ステータス(OrderedItemsモデルのカラム)
# status => 注文ステータス(Orderモデルのカラム)
def update
@ordered_item = OrderedItem.find(params[:id]) # making_statusボタンどれ押されたか特定
@order = @ordered_item.order # 注文商品から注文テーブルの呼び出し(何度も呼び出すのは処理が増える為)
@ordered_item.update(ordered_item_params) # 製作ステータスの更新にはmaking_statusのデータ取得を必要と定義
if @order.status == "入金確認" # 紐づく注文ステータスが「入金確認」に更新されていたら
@ordered_items.update_all(making_status: "製作待ち") # 制作ステータスを全商品「製作待ち」に更新
end
redirect_to admin_order_path(@order)
end
private
def order_params
params.require(:order).permit(:status)
end
end
<h2></h2>
<p></p>
```html:orders/show.html.erb
<tr>
<th>注文ステータス</th>
<td>
<%= form_with model: @order, url: admin_order_path,local:true, method: :patch do |f| %>
<%= f.select :status, Order.statuses.keys %>
#status: {"入金待ち":0,"入金確認":1, "製作中":2, "発送準備中":3, "発送済み":4}
<%= f.submit '更新' ,class: "btn btn-success btn-sm" %>
<% end %>
</td>
</tr>
:
<table>
<tr>
<th>商品名</th>
<th>単価(税込)</th>
<th>個数</th>
<th>小計</th>
<th>制作ステータス</th>
<th></th>
</tr>
<% total=0 %>
<% @ordered_items.each do |ordered_item|%> #注文商品一覧が出る
<tr>
<td><%= ordered_item.item.name %></td> #商品名
<td><%= ordered_item.tax_included_price %></td> #税込価格
<td><%= ordered_item.quantity %></td> #数量
<td><%= total += ordered_item.tax_included_price*ordered_item.quantity %></td> #小計
<td>
<%= form_with model: ordered_item, url: admin_ordered_item_path(ordered_item), local:true,method: :patch do |f| %>
<%= f.select :making_status, OrderedItem.making_statuses.keys %>
#{"製作不可":0,"製作待ち":1,"製作中":2,"製作終了":3}
<%= f.submit "更新", class: "btn btn-success btn-sm" %>
<% end %>
</td>
</tr>
<%end%>
</table>
if @ordered_item.making_status == "製作中" # 紐づく商品のmaking_statusがひとつでも「製作中」になったら
@order.update(status: "製作中") # 注文ステータスを「製作中」に"自動更新"
# 「注文商品の個数」、「making_statusが「製作終了」の商品数」カウント
# 数が一致すれば、全商品のmaking_statusが「製作終了」となる
# 前提の補足: パティシエは商品が制作終了するたびにその商品のmaking_statusを3に"手動更新"していく
elsif @order.ordered_items.count == @order.ordered_items.where(making_status: "製作終了").count
@order.update(status: "発送準備中") #注文ステータスを「発送準備中」に"自動更新"
end
redirect_to admin_order_path(@ordered_item.order) #注文詳細に遷移
end
private
def ordered_item_params
params.require(:ordered_item).permit(:making_status)
end
end
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>
<h2></h2>
<p></p>