教材の内容に関係のない質問や教材とは異なる環境・バージョンで進めている場合のエラーなど、教材に関係しない質問は推奨していないため回答できない場合がございます。
その場合、teratailなどの外部サイトを利用して質問することをおすすめします。教材の誤字脱字や追記・改善の要望は「文章の間違いや改善点の指摘」からお願いします。
モデルを作成したらアソシエーションの設定を行います。
アソシエーションとはモデル間の関連付けのことです。
まず、chat_messagesテーブルを確認しましょう。
カラム名 | データ型 |
---|---|
content | text |
user_id | references |
chat_room_id | references |
テーブルにuser_id
とchat_room_id
があるので、UserモデルとChatRoomモデルとのアソシエーションを考えます。
UserモデルとChatMessageモデルには、以下のような関係性があります。
Copied!- ユーザーは複数のメッセージを送ることができる
- メッセージAを送信したユーザーは1人しかいない
このような関係を「1対多」といいます。
では、app/models/user.rb
に以下のコードを追加します。
app/models/user.rb123456789101112 Copied!class User < ApplicationRecord
has_many :reactions
has_many :chat_room_users
has_many :chat_rooms, through: :chat_room_users
has_many :chat_messages
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
# 中略
has_many
は、他のモデルとの間に「1対多」のつながりがあることを示します。(「1側」にhas_many
を記載します)
「多」のモデルの方には、belongs_to
が使われます。
次に、app/models/chat_message.rb
に以下のコードを追加します。
ChatRoomモデルとChatMessageモデルには、以下のような関係性があります。
Copied!- 1つのチャットルームには複数のメッセージを持つことができる
- メッセージAは、1つのチャットルームに属する
このような関係を「1対多」といいます。
では、app/models/chat_room.rb
に以下のコードを追加してください。
app/models/chat_room.rb123456 Copied!class ChatRoom < ApplicationRecord
has_many :chat_room_users
# ここに追加
has_many :chat_messages
has_many :users, through: :chat_room_users
end
次に、app/models/chat_message.rb
に以下のコードを追加します。
以上でアソシエーションの設定は終了です。
お疲れさまでした。