質問: この記事 を参考に一応チャットをするところ(ユーザー名やIDなどは表示されない・複数グループは作れない)までは出来ました。 現状のチャットに 1. ユーザー名・IDを表示したい。 2. グループ1、グループ2..など誰でもグループを作れるようにしたい。(グループ名は編集可能) 3. グループを認証制にして認証されて人だけがチャットを投稿できるようにしたい。(見ることは誰でもできる) 4. 画像を投稿することができる。 5. 既読機能(できれば) をつけたいのですがおすすめの記事などはありますでしょうか。 色々調べて様々なサイトを見たのですがいまいちわかりやすい記事が無く挫折しています。 ### メッセージとユーザー名・ユーザーIDの紐付け 普通の投稿と同じようにメッセージテーブルにuserカラムを追加してユーザー名とユーザーIDを保存する方法で合っているのでしょうか。 ### グループ機能 普通に作ったメッセージ送信機能をグループ別に分けてそれぞれ別の内容のチャットを表示するにはどのようにしたら良いのでしょうか。 認証制度 ---- グループの参加を認証制にしたいのですがこちらも色々調べたのですがなかなか有力な情報が出てきませんでした。 チャットの内容は誰でも見れるようにしてチャットを送信するには認証が必要にするにはどうしたら良いのでしょうか。 質問内容が長くなって申し訳ございません。 参考になる記事などありましたら教えていただけると幸いです。 ![現状](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/acfa646f67f79dd9b29a0d5f6333aa2f.png)
回答: ### メッセージとユーザー名・ユーザーIDの紐付け まず,userテーブルがまだ存在しないとしたら作ってください。「gem device」や「gem sorcery」などが使えます(deviseの参考記事) (ついでにログイン機能なども作っておくといいでしょう) そのあとmessageテーブルにuser_idカラムを追加してください。 そうしたらuser.rbとmessage.rbにアソシエーションを追加してください。アソシエーションの参考記事 ### グループ機能 groupテーブルを作ってください。カラムはname,passwordくらいでしょうか。 ユーザーが1つのグループにしか参加できないとしたらgroup has_many usersの関係(1対多の関係)なのでuserテーブルにgroup_idをつけ,またそれぞれのモデルにアソシエーションをつけてください。 ユーザーが複数のグループに参加できるとしたら多対多の関係なので中間テーブルを作る必要があります。多対多の参考記事 ### 認証制度 上記のグループ機能でgroupテーブルにpasswordを設定したので,そちらを利用してください。 グループ作成の際にグループ名とパスワードを登録するようにする=>グループ参加の際にパスワードを入力するようにして,パスワードが一致すれば参加できる という流れになると思います。 質問の規模が大きかったので答えもざっくりとしたものになってしまいましたが,また細かいところで分からなかったら細切れにして質問すると良いと思います。