🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

1447閲覧

中間テーブル内から複数の外部キーにマッチするレコードを取得したい

soukun

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2020/12/21 08:58

編集2020/12/21 10:27

実現したいこと

部屋ごとに名前を設定して入室できるチャットアプリをRuby on Railsを使って開発しています。
そのため、ルームごとのユーザー名を格納してある中間テーブルRoomuserを作成しました。
そこで、特定のルームかつ特定のユーザーの情報を中間テーブルから引っ張り出してきたいです。

追記

部屋ごとに同一ユーザーを違うユーザー名で表示したいので、Roomuserにユーザー名を格納しています。
各部屋に対応したユーザー名をチャットへ表示させるために、Messageにあるuser_idと参加しているルームのidを使って、Roomuserからname(ユーザー名)を取得してきたいです。
###データベースの構成

Room

idname
1RoomA
2RoomB
3....

User
|id|email|pass|
|:--:|:--:|
|1|user.a@example.com|...|
|2|user.b@example.com|...|
|3|....|...|

Roomuser

idroom_iduser_idname
111UserA
222UserB
321UserA'
4.........

Message

idroom_iduser_idcontent
111Hello!
222Hello!
321hi!
4.........

現状思いついた実装方法

1.Roomuserから指定したroom_idのユーザー名をすべて取得

Ruby

1#rooms_controller.eb 2@room = Room.find(params[:id]) 3@username = @room.room_users

2.すべて取得した中からMessageuser_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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2020/12/21 09:50

「情報を中間テーブルから引っ張り出してきたい」というところがわかりません。 中間テーブルには room_id user_id( name は蛇足)しか情報がなく、これは特定のルームかつ特定のユーザー指定そのものなので、他には何も情報はないですね。
soukun

2020/12/21 10:17

例えば、room_idが1でuser_idが1の場合、"UserA"を引っ張ってきたいという意味でした。わかりにくくてすみません。
guest

回答1

0

ベストアンサー

「、room_idが1でuser_idが1の場合、"UserA"」
???
User.find(user_id).name でしょ?
Room毎に名前を変えられる? の?
だと
RoomUser.find_by(room_id: 1, user_id: 1).name

投稿2020/12/21 10:30

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

soukun

2020/12/21 11:23

回答していただきありがとうございます。無事に解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問