ユーザーの好みに合わせて服をおすすめするアプリを作成しました

未経験からのWeb系エンジニア転職を目指し、ポートフォリオサイトをRuby on Railsで作成しました。

## アプリケーション
　　
アプリケーション：「PICK OUT」  
※~~Herokuで動かしているので最初のページの表示に時間がかかる場合があります~~  
~~(2022/10/24追記)[この記事](https://qiita.com/kyabetsuda/items/391044601a113f73667d)を参考にHerokuにアドオンを追加し対応しました。~~ 
(2022/11/29追記)現状公開していません。 
ソースコード：https://github.com/bellmmm/original_rails_app  

## アプリケーション概要
アカウントを作成したユーザーに対し、テストを通してユーザーの服の好みを判断し、ユーザーの好みに合わせて洋服をおすすめするアプリケーションです。

## 目的
自分の好きな服、似合う服をはっきりと認識している人は少ないと思います。私もECサイトで服を購入したり店舗で試着をしてみて、しっくりこないと感じたことが多くあります。そこで、人はそれぞれ好まない要素が無意識にあると仮定しました。このWebアプリでは、ユーザーがしっくりこない服をいくつか選ぶことで好まない要素を想定し、それを持たない服をおすすめ商品として提示することで、ユーザーがより似合う服を発見することを手助けします。


## 使用イメージ
アプリを利用する際の操作方法の動画です。
1. ゲストユーザーとしてログイン
2. 好まない服の選択し、submitする
3. おすすめ服の確認
4. 再度好まない服の選択し、submitする
5. おすすめ服の確認
<iframe width="560" height="315" src="https://www.youtube.com/embed/65PAp6yf2bY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 開発で苦労したこと
### 5つのテーブルを繋げること
チュートリアルを読み直しながら関係性を設定しました。
### テーブルをまたがって欲しい要素を取り出すこと
SQLの本を見直しながら、テーブルを結合して欲しい要素を取り出しました。
### プログラミング、Webの勉強
技術を習得し、自分の手でサービスを作りたい、という思いから勉強を始めましたが、ここまで来るのにかなり時間がかかりとても苦労しました。最初はWordpressでブログを作るところから始め、コンピュータやWebの基礎的な知識を勉強した後、Railsチュートリアルを完走し、このポートフォリオサイト完成までこぎつけました。ここまで勉強したこと、読んだ本、作ってみたものについては以下の記事にまとめています。

[ポートフォリオサイト作成までに勉強した内容を紹介します](https://qiita.com/bellmmm/items/caeb0e85366dfe6e77e9)

## その他工夫したこと
### 商品に関連付ける要素を想定よりも減らした
現状では商品のデータ数が多くないため、ユーザーのdislike要素(テストを通して判断したユーザーの嫌いな要素)を取り出すSQL文において、“テストで要素が2回以上選択された場合”としています。
そのため、多くの商品で関連付けられている要素があると、その要素が"dislike"要素になりやすくなってしまいます。
上記の理由から、商品間であまり共通していない要素を使用することにしました。
### 効率的な開発を心掛けた
* masterブランチへのpushを禁止し、機能ごとにブランチを作ってpull requestをした。また、commit logを見やすくするため、[このqiitaの記事](https://qiita.com/numanomanu/items/45dd285b286a1f7280ed)を参考にcommitメッセージにプレフィックスを付けた。
* 製作を始める前にモック図やER図を作成し、READMEに記載した。
* 各機能ごとにTo-doリストを作成し、READMEに記載した。
* モデルクラスのメソッドとRESTfulなルートを表にまとめ、READMEに記載した。


## 機能一覧
* ログイン機能
* ユーザーのdislike商品テスト機能
* ユーザーの好まない要素表示機能
* おすすめ商品表示機能
* ゲストユーザーログイン機能

## ER図
このアプリケーションのER図は以下の通りです。
```mermaid
erDiagram

users ||--o{ dislikes: ""
products ||--o{ dislikes:""
products ||--|{ composed:""
features ||--o{ composed:""

users {
  integer id PK
  string name
  string email
}

dislikes {
  integer user_id FK
  integer product_id FK
}

products {
  integer id PK
  varchar name 
  string phiti_by
}

composed {
  integer product_id FK
  integer feature_id FK
}

features {
  integer id PK
  string feature
}
```

## 環境
言語: Ruby  
フレームワーク: Ruby on rails  
フロントエンド: HTML&CSS/Bootstrap/JavaScript  
DB: PostgreSQL  
インフラ: Heroku  
開発環境: DockerでRubyコンテナを実行し、VS Code Remote Containerで接続
ソースコード管理: GitHub(https://github.com/bellmmm/original_rails_app)  

## アプリの改善点
### セキュリティ
* Ruby、Railsや依存ライブラリのバージョンを最新にする。
### スキルアップとして
* herokuへのデプロイからAWS ECSへのデプロイに変更し、CI/CDに対応する。
* RailsをAPI化し、フロントエンドをReactに分離する。
### アプリの機能向上として
* 工夫したことで述べた通り、商品の数が少ないことでユーザーの好みに合わせられる精度が低くなっている。商品の数を増やし要素の取り出し方を厳しくすることで、ユーザーの好みをより反映したい。
* 嫌いな要素を基におすすめ商品を表示しているが、テストで嫌いな商品、好きな商品、その他を選べるようにして、好きな商品として選んだ商品に共通する要素をlike要素としておすすめ商品の表示に反映できるようにしたい。
* 商品の数を増やし、テスト用の商品をランダムに表示しても要素が偏らないようにし、ランダムな製品でのテストを行えるようにしたい。また、要素ごとに商品を検索できるようにしたい。
* 商品を試着して好きだったか、嫌いだったかを反映することで、視覚だけでないユーザーの好み(似合う・似合わない)を反映させられるようにしたい。