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

在庫管理onRails.pdf

 在庫管理onRails.pdf

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 それ以外のエラーの場合、在庫を戻す