実現したいこと
部屋ごとに名前を設定して入室できるチャットアプリを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
プレビュー