Upgrade to Pro — share decks privately, control downloads, hide ads and more …

在庫管理onRails.pdf

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 在庫管理onRails.pdf

Avatar for Yuki Horikoshi

Yuki Horikoshi

September 06, 2024
Tweet

More Decks by Yuki Horikoshi

Other Decks in Programming

Transcript

  1. パターン A タクラミのテーブルにそのまま持たせる create_table "takuramis", force: :cascade do |t| t.string

    "title", null: false t.text "description" t.integer "price", null: false t.integer "stock", null: false, default: 0 # 在庫 t.references :user, foreign_key: true t.timestamps end ※ コードはダミーです
  2. パターン B 在庫テーブルを作る create_table "stocks", force: :cascade do |t| t.integer

    "quantity", null: false, default: 0 t.references :takurami, foreign_key: true t.timestamps end ※ コードはダミーです
  3. こうしました create_table "takuramis", force: :cascade do |t| t.string "title", null:

    false t.text "description" t.integer "price", null: false t.integer "slot", null: false, default: 0 # 総枠数 t.references :user, foreign_key: true t.timestamps end create_table "stocks", force: :cascade do |t| t.integer "quantity", null: false, default: 0 # 実際の在庫 t.references :takurami, foreign_key: true t.timestamps end ※ コードはダミーです
  4. takurami_order.rb def self.process_order valid_order! takurami.stock.decrement_quantity! ActiveRecord::Base.transaction do case Payment.process!(user: user,

    amount: takurami.price) when :success true when :insufficient_funds raise PaymentError, "残高不足" else raise PaymentError, "不明なエラー" end rescue ActiveRecord::RecordNotFound => e raise e, '応募可能な商品が見つからないか、申し込み中に在庫がなくなりました' rescue StandardError => e takurami.stock.increment_quantity! raise e end end ※ コードはダミーです
  5. 決済の大まかな流れ 1. タクラミのバリデーション 認可 2. タクラミの在庫を減らす 決済の成功可否に関わらず減らす 3. 決済のトランザクション 応募レコードの作成

    カード関連のエラーはここで補足 4. 例外処理 申し込み中に在庫が 0...etc それ以外のエラーの場合、在庫を戻す