LoginSignup
1
1

More than 1 year has passed since last update.

制作状況 

Posted at

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

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

    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

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>

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 @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



1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1