コロナで無職になった私がエンジニアになるまで

コロナの影響で前職をクビになってから、エンジニアを目指してます。

オリジナルアプリ作成記 6 ~チャットルームの実装~

次にユーザー間でチャットできるような機能を実装する。

まず大前提として準備するものが二つある。
チャットルームとチャット画面の二つである。

レイアウト
完成した後に書くのもアレだけど、こんな感じで作成した。
参考にしたものはスクールのレイアウト。

f:id:Kosei_Program:20210116162540p:plain

画面左側にチャットルームが配置されて、真ん中にチャット画面が出る流れ。
試しにチャットルームを作成してみる。

f:id:Kosei_Program:20210116171217p:plain

レイアウトに関しては、完全にスクールの課題を参考にしている。
ここでルーム名を入力して、チャットメンバー(登録されているユーザー名)を選択すると一対一のチャットルームが作成される。

ちなみにルーム名にはバリデーションを組んでいるので、空で登録することはできない。
ここで問題になるのが多対多の関係。
ユーザーは多くの部屋に入る(持つ)ことができる。
ルームは多くのユーザーを持つことができる。
お互いにhas_manyの関係になると、いざ登録した時に無駄なカラムを作成してしまう。
ここで必要なのは中間テーブルと呼ばれるもの。

中間テーブル
room_userと名付けた中間テーブルを作成する。

f:id:Kosei_Program:20210116171750p:plain

マイグレーションには、room_id(作成する部屋)とuser_id(誰が入っているか)を記述する。
他のテーブルの要素を参考にするのでreferencesで。
外部キー制約?とか言ってたかな、foreign_key: true と記述するのも忘れずに。

これで多対多の問題は解消される。
流れとしては、部屋を作るとこの中間テーブルに
作成した部屋のid 部屋にいるuserのid
作成した部屋のid 指名したuserのid
と二つ記録されることになる。

部屋単体のテーブルには、部屋の名前だけ記録される。

実際に作成してみると…。

f:id:Kosei_Program:20210116172335p:plain

roomテーブルには…。

f:id:Kosei_Program:20210116172447p:plain

中間テーブルには…。

f:id:Kosei_Program:20210116172640p:plain

試しに作成した部屋がたくさんあるのでわかりづらいが、一番下の2項目が今回作成した部屋に該当する。


アソシエーションを組んでいることにより、互いのユーザー間であれば共通の部屋に入ることができる。

f:id:Kosei_Program:20210116173709p:plain

このcurrent_user.roomsの記述で操作しているユーザーと紐づいているroom(部屋)を表示する。

部屋の作成自体はこれで終了。
細かいアクセス制限は次回にする。