# プロジェクト概要
高齢者の健康維持や家族間のコミュニケーション量低下を解決する目的で開発した。
高齢の両親・子供を持つ親を対象に家族向けSNSアプリ。
ユーザーは両親の生存確認、両親は健康維持とユーザー家族とのコミュニケーションが可能。
## 利用イメージ
### ユーザー
1. 登録後プランを選択しアプリをインストール・NFCタグを購入
2. ユーザーに紐づく家族ユーザーを招待
3. 家族ユーザーが写真・動画・音声をアップロード
4. 両親ユーザーのウォーキング開始・終了のプッシュ通知
### 両親ユーザー
1. NFCタグを用いてウォーキングを開始・終了
2. 家族ユーザーがアップロードした写真・画像・音声が自動でアプリ上に展開
# アプリケーション概要
フレームワーク: Ruby onRails, Vue,js, jQuery
使用言語: Ruby, JavaScript
開発環境: Docker(docker-compose)
データベース: MySQL
その他: RSpec, AWS(VPC, EC2, CloudFront, Route53, RDS, ELB, SES), Sidekiq, Nginx
# 担当工程の詳細
## iOS/Androidアプリ用APIの開発
ユーザーと紐づく家族の登録、参照、削除、変更を行うAPIを開発。
開発・テストはRSpecを用いたテスト駆動開発。
## ウォーキング履歴の参照、CSV出力を行うAPIの開発
Vue.js/Railsの構成で、既存CMSのカスタマイズ、APIの開発を担当。
DBからユーザー毎のウォーキング履歴を取得し、統計してCSVに非同期で出力・管理者へメールを送信する。(Sidekiqを用いて非同期処理で行う)
## サブスクリプション契約画面、決済処理の開発
フロントエンドはRailsのerbを用いてサブスクリプション契約時の画面を作成(契約プランの選択/クレジットカード情報入力画面等)
バックエンドでは決済代行会社の外部APIにトークン、パスワードを渡すことでクレジットカード情報の登録, 参照, 与信売上計上などを行う。
契約プランの登録時やクレジットカード登録時にはRailsのAction Mailer, AWS SESを用いて完了メール等を送信
## 課題・問題
決済会社毎の売上検索機能の開発を担当した際、
複数テーブルからデータを抽出し、統計する必要があり
ORMを用いて1レコードずつDBから取得し、取得したデータの重複を削除しまとめる。
という処理を行っていたのですが、
複数テーブルからデータを抽出する為、ORMだと
- 実行時間が長い
- 複雑で分かりにくい
- 追加の要望があった際などに、変更の工数が増える可能性がある
などの問題があり、改善する必要がありました。
そこで以下を試しました。
- 「同じような状況で、解決した事例がないか」を検索
- 「既存パッケージで同じような処理を行っていて、参考にできそうな箇所がないか」を調べる
すると、ORMを使わず、SQL文を実行することで問題点を解決しつつ、目的の統計データを抽出できそうなことが分かり、試してみることに、
しかし、SQLを直接実行するような実装の経験がなく、知識不足だった為
SQLの基礎や検索に使えそうなSQL文などを勉強し、仮説を立てながら1つずつ検証していきました。
途中、MySQLの`ONLY_FULL_GROUP_BY`オプションがonになっていてselectに書いたカラムをgroup_byに入れないとエラーになる問題などもありましたが、`group_concat`関数を用いいることで解決し、
無事、課題を解決しつつDRYな実装にすることができました。