2026年10月30日の日記 📖
七海
今日のメモ
# 今日やったこと
■ 卒業制作
- 16タイプと4グループを管理する`PersonalityType`モデルを作成
- 16タイプの初期データをseedで登録
- UserとPersonalityTypeを関連付け、初期設定前は未選択でも登録できるようにした
- バディキャラ18件を管理するモデルと初期データを作成
- ユーザーが選んだバディキャラを保存できる関連を追加
- SD・全身・顔アイコン画像を用意し、DBには画像パスを保存する形にした
- バディキャラごとに`casual`/`polite`の話し方を設定
- seedの再投入、RSpec、RuboCop、CIまで確認
# 今日理解できたこと
共通データは、ユーザーごとに文字列を直接持たせるのではなく、専用テーブルで管理してIDを参照する形にすると、重複を減らして一貫したデータを扱いやすくなる。
ユーザー登録とタイプ選択は別のタイミングなので、DB側でもNULLを許可し、初期設定前でも登録できるようにする。
#### モデル側のチェックとDB制約は役割が違う
モデルのバリデーションは、保存前に分かりやすいエラーとして扱うためのもの。
一方で、NOT NULL・ユニーク制約・外部キーなどのDB制約は、データ自体の整合性を守るために設定する。
特にタイプコードの重複は、モデルだけでなくDB側にもユニークインデックスを設定した。
また、外部キーを設定していても、NULLを許可することで「まだ選択していない状態」は表現できることが分かった。
#### seedは繰り返し実行しても増えないようにする
初期データは、
`find_or_initialize_by(code: code)`
で既存のタイプを探し、あれば再利用する形にした。
そのため、seedを繰り返し実行しても同じタイプが追加され続けることはなく、実際に再投入後も16件のままであることを確認した。
#### バディキャラのデータと画像は分けて管理する
バディキャラはDB上では18件登録するが、画像は6セットだけを使う設計にした。
- 動物:NT・NF・SP・SJの4種類
- 人物:INTPの男の子・女の子
動物はグループごとに同じ画像を共有するため、18レコードすべてに別画像を用意する必要はない。
画像ファイルは`app/assets/images/companions`へ置き、DBには画像そのものではなく参照用のパスを保存する。
この形なら、将来タイプ専用の画像が増えた場合も、対象レコードの参照先だけ変更できる。
# まだ理解できていないこと
- AI対話・まとめで`casual`/`polite`を切り替える処理
- 本番環境への初期データ投入
# 次にやること
「12. 本番メール送信サービスの選定・送信検証を行う
#16」
# 感想など
この2日で、16タイプという共通データから、実際にユーザーが選ぶバディキャラ:ミツメイトまで一気につながった。
特に、DB上のレコード数と画像ファイル数を一致させる必要はなく、参照先を分けて管理することで、MVPの制作量を抑えつつ将来の差し替えにも対応できる設計にできたのがよかった。
■ 卒業制作
- 16タイプと4グループを管理する`PersonalityType`モデルを作成
- 16タイプの初期データをseedで登録
- UserとPersonalityTypeを関連付け、初期設定前は未選択でも登録できるようにした
- バディキャラ18件を管理するモデルと初期データを作成
- ユーザーが選んだバディキャラを保存できる関連を追加
- SD・全身・顔アイコン画像を用意し、DBには画像パスを保存する形にした
- バディキャラごとに`casual`/`polite`の話し方を設定
- seedの再投入、RSpec、RuboCop、CIまで確認
# 今日理解できたこと
共通データは、ユーザーごとに文字列を直接持たせるのではなく、専用テーブルで管理してIDを参照する形にすると、重複を減らして一貫したデータを扱いやすくなる。
ユーザー登録とタイプ選択は別のタイミングなので、DB側でもNULLを許可し、初期設定前でも登録できるようにする。
#### モデル側のチェックとDB制約は役割が違う
モデルのバリデーションは、保存前に分かりやすいエラーとして扱うためのもの。
一方で、NOT NULL・ユニーク制約・外部キーなどのDB制約は、データ自体の整合性を守るために設定する。
特にタイプコードの重複は、モデルだけでなくDB側にもユニークインデックスを設定した。
また、外部キーを設定していても、NULLを許可することで「まだ選択していない状態」は表現できることが分かった。
#### seedは繰り返し実行しても増えないようにする
初期データは、
`find_or_initialize_by(code: code)`
で既存のタイプを探し、あれば再利用する形にした。
そのため、seedを繰り返し実行しても同じタイプが追加され続けることはなく、実際に再投入後も16件のままであることを確認した。
#### バディキャラのデータと画像は分けて管理する
バディキャラはDB上では18件登録するが、画像は6セットだけを使う設計にした。
- 動物:NT・NF・SP・SJの4種類
- 人物:INTPの男の子・女の子
動物はグループごとに同じ画像を共有するため、18レコードすべてに別画像を用意する必要はない。
画像ファイルは`app/assets/images/companions`へ置き、DBには画像そのものではなく参照用のパスを保存する。
この形なら、将来タイプ専用の画像が増えた場合も、対象レコードの参照先だけ変更できる。
# まだ理解できていないこと
- AI対話・まとめで`casual`/`polite`を切り替える処理
- 本番環境への初期データ投入
# 次にやること
「12. 本番メール送信サービスの選定・送信検証を行う
#16」
# 感想など
この2日で、16タイプという共通データから、実際にユーザーが選ぶバディキャラ:ミツメイトまで一気につながった。
特に、DB上のレコード数と画像ファイル数を一致させる必要はなく、参照先を分けて管理することで、MVPの制作量を抑えつつ将来の差し替えにも対応できる設計にできたのがよかった。
visibility
公開