実現したいこと
部屋ごとに名前を設定して入室できるチャットアプリをRuby on Railsを使って開発しています。
そのため、ルームごとのユーザー名を格納してある中間テーブルRoomuserを作成しました。
そこで、特定のルームかつ特定のユーザーの情報を中間テーブルから引っ張り出してきたいです。
追記
部屋ごとに同一ユーザーを違うユーザー名で表示したいので、Roomuserにユーザー名を格納しています。
各部屋に対応したユーザー名をチャットへ表示させるために、Messageにあるuser_idと参加しているルームのidを使って、Roomuserからname(ユーザー名)を取得してきたいです。
###データベースの構成
Room
| id | name |
|---|---|
| 1 | RoomA |
| 2 | RoomB |
| 3 | .... |
User
|id|email|pass|
|:--:|:--:|
|1|user.a@example.com|...|
|2|user.b@example.com|...|
|3|....|...|
Roomuser
| id | room_id | user_id | name |
|---|---|---|---|
| 1 | 1 | 1 | UserA |
| 2 | 2 | 2 | UserB |
| 3 | 2 | 1 | UserA' |
| 4 | ... | ... | ... |
Message
| id | room_id | user_id | content |
|---|---|---|---|
| 1 | 1 | 1 | Hello! |
| 2 | 2 | 2 | Hello! |
| 3 | 2 | 1 | hi! |
| 4 | ... | ... | ... |
現状思いついた実装方法
1.Roomuserから指定したroom_idのユーザー名をすべて取得
Ruby
1#rooms_controller.eb 2@room = Room.find(params[:id]) 3@username = @room.room_users
2.すべて取得した中からMessageのuser_idを使ってユーザー名を検索
Ruby
1#_message.html.erb 2<% @username.each do |user| 3 if user.id == message.user.id then %> 4 <%= "#{user.name}: #{message.content}"%> 5 <% break 6 end 7end %>
しかし、この方法だと1つのメッセージを表示するごとに1回ループを回さないといけないのでとても非効率だと感じました。
もっと良い方法があれば教えていただきたいです。
バージョン
- Ruby 2.6.6
- Rails 6.0.3
- SQLite 1.4.2
- devise 4.7.3
回答1件
あなたの回答
tips
プレビュー