ダイレクトメッセージ機能
検索に苦労したのでDM機能について簡単に実装手順を紹介します。
前提として、DM機能の実装には
①トークルームを作成してそこで話す機能を実装する方法(中間テーブルが2つ)
②トークルームを作成しない方法
があります。
今回は②についての説明です。
ER図
roomモデルを作らなくても作成できる理由は、routesで設定できます。
手順
usersモデルがある前提で書きていきます。
$ rails g model Messages content:string user:references receive_user:references
Messages modelとmigrateファイルを作成します。
完成したものがこちら
_create_messages.rb
class CreateMessages < ActiveRecord::Migration[5.2]
def change
create_table :messages do |t|
t.string :content
t.references :user, foreign_key: true
t.references :receive_user, foreign_key: { to_table: :users }
t.timestamps
end
end
end
_create_messages.rb
{ to_table: :users }
を追記しています。
これが無いと、receive_usersテーブルを参照してしまうので『そんなテーブルは存在しないよ』と言われてしまいます。
そのため、外部キーとしてusersテーブルを参照するという指定を行っています。
$ rails db:migrate
↑します。
続いて、model
models/message.rb
class Message < ApplicationRecord
belongs_to :user
belongs_to :receive_user, class_name: 'User'
end
models/message.rb
class_name: ‘User’
を追加します。
これによって、receive_userがReceive_userという存在しないクラスを参照することを防ぎます。
models/user.rb
has_many :messages
has_many :sent_messages, through: :messages, source: :receive_user
has_many :reverses_of_message, class_name: 'Message', foreign_key: 'receive_user_id'
has_many :received_messages, through: :reverses_of_message, source: :user
def sent_messages(other_user, content) #メッセージを送るためのメソッド
unless self == other_user
self.messages.find_or_create_by(receive_user_id: other_user.id, content: content)
end
end
これで完成です!
しっかり作成できるか $ rails cで確認することは忘れないでください🙇♂️
補足
修正依頼などあれば気軽にお申し付けください。