質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

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

Ruby on Rails

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

Q&A

1回答

7703閲覧

個人メッセージ機能のデータベース設計について(Rails)

wisdom

総合スコア18

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2016/09/27 06:06

編集2016/09/27 06:11

データベース内容

Railsで個人メッセージ機能を作成したいのですが、うまくいかず困っています。
twitterのDM機能をイメージしています。

各ユーザー二人でのみやりとりを見ることができます。

そのためROOMを作り、まずは二人だけの組み合わせを作成し
そのRoomごとにコメントが投稿できるようにしようと考えました。

そして画像のような構造にしたのですが、うまくいきません。

Messageのsend_user_idが不要なのかもしれないと思うのですが、
そうすると送信者が特定できませんよね・・・?

この設計についてアドバイスお願いいたします。

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

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

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

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

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

twin_bird

2016/09/27 06:18

DBにおいてRoomという概念??は蛇足なのでは? DMのインターフェースを一部屋に見立てているのでしょうが、ロジックで'部屋'を形成すればいいのではないでしょうか?
twin_bird

2016/09/27 06:21

Messageのテーブルに受信者のuser_idを保存すれば後はロジックで何とかなる気がしますが、DB設計のベテランではないのでもっと良い設計はあるかもしれません。
guest

回答1

0

こんにちは。

今提示されている条件でしたら、私なら以下のように設計するかと思います。
参考になるか分かりませんが・・・・

機能追加、という記述を見逃していたので、書き直しましたが
twin_bird さんのご意見と似た形になりました(恐らく)

Userテーブル
・id(ID)
・name(名前)

Messageテーブル
・id(ID)
・message(メッセージ)
・user_id(送信者)
・send_user_id(受信者)

★ルームリストを作成する時
・Messageテーブルの user_id と send_user_id が自身になっているデータを集計して取得

投稿2016/09/30 00:20

編集2016/09/30 00:32
CyberMergina

総合スコア295

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

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

wisdom

2016/10/01 15:22

CyberMerginaさん、twin_birdさん回答ありがとうございます。 確かに2つのテーブルだけでも作成できそうですね!! 早速この書き方でやってはいるのですが関連付けの理解が難しく、かなり苦戦しております。 そこで関連付けとアクションについてお伺いしたいのですが、 例えば、現在のユーザーの(Messageテーブルの中の)messageを取得する場合には、 下記の関連付けではおかしいでしょうか・・・? /User.rb has_many :message /Message.rb belongs_to :send_user, class_name: "User", foreign_key: "send_user_id" belongs_to :recipient_user, class_name: "User", foreign_key: "recipient_user_id"
wisdom

2016/10/02 15:08 編集

下記のように配列を取得しましたが、@conversationsのsend_userのuserの名前などを取得することができません・・・。 (messagesテーブルの中から、send_userとrecipient_user、contentなどの書き込みの内容を取得はできました。) アクション @send_messages = Message.where(send_user: current_user.id, recipient_user: @user.id) @recieve_messages = Message.where(send_user: @user.id, recipient_user: current_user.id) @conversations = @send_messages + @recieve_messages @conversations.sort! User.rb has_many :messages has_many :messages_user, through: :messages, source: :send_user この書き方ではどう書き換えても取得ができませんでした。。。 何かアドバイス頂けないでしょうか・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問