Closed terakura-aina closed 3 years ago
変更後のテーブル設計で既存の機能に生じる変更作業 →rakeタスクの中でtoday_missionsのcreate作業をinvited用とpartner用2つ分createする →ミッション一覧を確認するページの表示のための記述の変更
想定しているのはこの2点で、変更することにより大きな作業が発生することはなさそうです。
today_missionsにuser_idっていう外部キーがあるんですが、make_plansテーブルに紐づいてるのは間違いかな?make_plan_idになるべき?
変更後ので良さそうな気がしますねー。
仕様の話なんですが、夫婦お互い同じミッションが課されるんですかね?もしそれぞれ違うミッションが課されるのであれば変更前のだときつそう。inviter_mission_idもしくはpartner_mission_idのどちらか片方はnullになるっていう設計になると思うのでデータ不整合が起こりやすい気がする。
紐付け方がいまいちわからなかったのですが、
TodayMission.cretate
するときに、make_plansテーブルに保存されているinvited_id,partner_idを通してuser.idを取得する、という意味で上記のように紐付けました。
仕様の話なんですが、夫婦お互い同じミッションが課されるんですかね?もしそれぞれ違うミッションが課されるのであれば変更前のだときつそう。inviter_mission_idもしくはpartner_mission_idのどちらか片方はnullになるっていう設計になると思うのでデータ不整合が起こりやすい気がする。
ランダムなので基本は違うミッションが課され、たまに同じ可能性もある、といった感じです。 私が考えていた方法だと、ミッションをそれぞれ生成し、その後同じタイミングでTodayMissionsテーブルの1つのレコードに2つとも保存していたのでnullにはならない仕様でした。 しかし、完了ステータスを実装したいと考えた時に、テーブルの構造が複雑になってしまうとのことだったので、問題なさそうであれば変更したいと思っています。
user_idにはmake_plan_idではなく、user.idを入れたいと考えています。 usersテーブルのidと紐づけるべきでしょうか?
user_idにはmake_plan_idではなく、user.idを入れたいと考えています。
today_missions
テーブルのuser_id
についてですかね、そうであれば以下のようにモデル名も記載することでどのテーブルの話かがズレることなく伝わると思います(カラム名だけだといくつか候補があるので)
TodayMission.user_id
usersテーブルのidと紐づけるべきでしょうか?
はい。TodayMission.user_id
にはUser.id
が対応しているカラムだと思います。
しかし変更後のER図
ではTodayMission
とUser
ではなく、TodayMission
とMakePlans
がアソシエーションの関連を示す線で繋がっていると思います。
こちらは変更前のER図
でTodayMission
にinviter_user_id
とpartner_user_id
が残っていた名残で変更されていない部分かと思われるので、こちらも併せて変更する必要があると思います。
ミッション一覧ではtoday_mission
の一覧を表示すると思うのですが、ログインユーザ自身に割り当てられたミッションを絞り込んで表示すると思うので、TodayMission.make_plans.invited_id == current_user.id
のような比較になってしまうと思います。
またtoday_mission.make_plans.partner_id == current_user.id
の比較も併せて必要になりそうな感じがするので、
以下の状態のuser_id
のみ持っている形であればtoday_mission.user_id == current_user.id
とシンプルな比較で済むかと思います。
https://github.com/terakura-aina/Date_me/issues/16#issuecomment-781991469
ミッション一覧で表示するミッションが招待された側 or 招待した側として識別しながら表示する必要は特にないと思うので、user_id
があれば十分な気がしますね。
スケジュールと紐づいているuser.idを取得したいため、
ここの意図ってなんでしたっけ?
以下の状態のuser_idのみ持っている形であればtoday_mission.user_id == current_user.idとシンプルな比較で済むかと思います。
ページを開いた瞬間はuser情報が取得できておらず、current_userメソッドが使えない(current_userがnullになりエラーになってしまいます)のですが、 ミッションを送る段階でそのミッションはinvited_user宛てか、partner_user宛てなのかはわかっているため、現在のテーブル設計の場合にはなりますが、
https://liff.line.me/1655665365-robLXJ1P/missions/#{schedule.token}/invited
開いてもらうURLにinvitedもしくはpartnerと情報を持たせ、
-if params[:user] == 'invited'
- @schedule.invited_missions.each do |mission|
tr
td.px-4.ml-2.p-2.wf-kokoro = mission.body
-if params[:user] == 'partner'
- @schedule.partner_missions.each do |mission|
tr
td.px-4.ml-2.p-2.wf-kokoro = mission.body
paramsでinvitedの場合は@schedule.invited_missions
のように条件分岐させてinvitedのミッション一覧/partnerのミッション一覧を表示させています。
テーブル設計が変わった場合の条件分岐の方法がまだ思い付いていないのですが、current_userメソッドが使えない場合でもuser_idのみあれば問題ないのでしょうか?
スケジュールと紐づいているuser.idを取得したいため、 ここの意図ってなんでしたっけ?
一つ上のコメントで内容を記述したのですが、current_userメソッドが使えない場合にinvited_userなのかpartner_userなのかを区別するには、make_plansテーブルにあるinvited_id/partner_idカラムで判断できると思ったからです。
■実現したいこと■ デート当日にミッションが送られてきたら一覧が見れるページで、それぞれのミッションに完了ステータスをつけたい 【画面遷移図】 https://xd.adobe.com/view/1720b733-f087-4b61-a494-12e01cba8629-4273/screen/d8d4e19c-8a73-4d73-81ca-3b3fe97b334f
■現状■ today_missionsテーブルでschedule_id,invited_mission_id,partner_mission_idを紐付けて「今日のミッション」を管理している(1つのレコードに、2つのミッションが紐づいている状態) →ここにinvited_mission_statusとpartner_mission_statusカラムを追加し、ステータスを管理すればいい?
■懸念点■ today_missionsテーブルの1つのレコードに誘った人、誘われた人へのミッションがどちらも含まれていると複雑な構造になってしまうのと、バグが起こった際にも原因の解明がしずらくなる
■改善案■ today_missionsテーブルは一つのミッションと紐づく構造にする (今までのテーブル設計→ミッション第一弾が送られる→today_missionsのレコードが1つ増える 改善案のテーブル設計→ミッション第一弾が送られる→today_missionsのレコードが2つ増える) 【ER図】 https://app.diagrams.net/#G1AGXLePP-HWYbJKf-u2P9vBgifvpB9Tbj
このようにテーブルの構造を変更して進めていこうかと思っています。 改善後のテーブル構造で懸念点などないか、ご確認いただきたいです。