Fumiya-Matsumoto / run_manage_spa

0 stars 0 forks source link

API設計【BestTimeモデル】 #16

Open Fumiya-Matsumoto opened 2 years ago

Fumiya-Matsumoto commented 2 years ago

概要

BestTimeモデルのAPIを設計する

目的

Fumiya-Matsumoto commented 2 years ago

追加であった方がいいカラム

Fumiya-Matsumoto commented 2 years ago

ベストタイムなので、同ユーザー、同distanceの重複はなし。ただし、公認、非公認は別に出せるようにする。

複数カラムにユニーク制約をつける

best_timesテーブルにuser_id, distance, officialの3つの組み合わせでユニーク制約のバリデーションを行うには、以下のようにする。

# app/models/best_time.rb
class BestTime < ApplicationRecord
    belongs_to :user
    validates :user_id, uniquness: { scope: [:distance, :official]}
end

scopeは範囲を指定して、一意かどうかをチェックしてくれる。これで、user_id, distance, officialが全て一致したデータは1件しか作れなくなる。

データベース側にもユニーク制約をつける

# db/migrate/20220619053800_add_unique_to_best_times.rb
class AddUniqueToBestTimes < ActiveRecord::Migration[6.1]
  def change
    add_index :best_times, [:user_id, :distance, :official], :unique=>true
  end
end

参考

Fumiya-Matsumoto commented 2 years ago

エンドポイントの作成

メソッド名 エンドポイント アクション
GET /v1/best_times(.:format) v1/best_times#index
POST /v1/best_times(.:format) v1/best_times#create
GET /v1/best_times/:id(.:format) v1/best_times#show
PATCH /v1/best_times/:id(.:format) v1/best_times#update
PUT /v1/best_times/:id(.:format) v1/best_times#update
DELETE /v1/best_times/:id(.:format) v1/best_times#destroy
Fumiya-Matsumoto commented 2 years ago

テストしたところ、user_id, distance, officialが全て一致したデータを重複して入れれなくなったが、レスポンスのステータスコードが422と想定外のものになっている。