Rails 4 で簡単なチャット アプリを作成しています。コントローラー、モデル、およびビューは作成されていますが、機能はまだ不完全です。データベースには、会話とメッセージの 2 つのテーブルがあります。会話テーブルには、送信者 ID と受信者 ID の 2 つのフィールドがあります。メッセージ テーブルには、body、user id、read の 3 つのフィールドがあります (デフォルトは 0 で、未読を意味します)。
モデル:
class Conversation < ActiveRecord::Base
belongs_to :sender, :foreign_key => :sender_id, :class_name => "User"
belongs_to :reciever, :foreign_key => :reciever_id, :class_name => "User"
has_many :messages, :dependent => :destroy
validates_uniqueness_of :sender_id, :scope => :reciever_id
scope :involving, lambda { |user_id|
where("sender_id = ? OR reciever_id = ?", user_id, user_id)
}
scope :between, lambda { |sender_id, reciever_id|
where("(sender_id = ? AND reciever_id = ?) OR (sender_id = ? AND reciever_id = ?)", sender_id, reciever_id, reciever_id, sender_id)
}
def other_interlocutor(user_id)
if sender.id == user_id
return reciever.id
else
return sender.id
end
end
end
class Message < ActiveRecord::Base
belongs_to :conversation
belongs_to :user
validates_presence_of :conversation_id, :user_id, :body
end
私がやろうとしているのは、誰かが新しいメッセージを受信するたびに、未読メッセージのカウントを受信するリアルタイム機能を作成することです。ユーザー間のチャットを作成するためにプライベート パブを使用しています。
この関数を含むユーザー モデルがあります。
def unread_messages_count
unread_messages = 0
# puts "Putting self conversations ! #{self.conversations.first}"
conversations = Conversation.involving(self.id)
conversations.each do |conversation|
unread_messages += conversation.messages.where(:read => 0, :user_id => conversation.other_interlocutor(self.id)).count
end
return unread_messages = unread_messages == 0 ? nil : unread_messages
end
ユーザーのすべての会話がリストされているページが1つあり、会話がクリックされると、その会話に関連するすべてのメッセージもリストされます。conversation_messages_path
同じページで、会話ごとに個別のチャネルを作成するために、すべてを購読しました。メッセージが送信されるたびに、create.js.erb
サブスクライブしたチャネルに公開するファイルがレンダリングされます。
<% publish_to conversation_messages_path(@conversation.id) do %>
$("#conversations_link").text("<%= current_user.unread_messages_count %> Conversations");
$("#messages").append("<%= escape_javascript render(:partial => 'message', :locals => { :message => @message })%>");
<% end %>
$("#conversation_link")
未読メッセージ数を表示したい場所です。
現在、未読メッセージ数は間違った数を返し、navbar はconversation.sender_id
メッセージが受信者に届いたときにのみ更新されます。
未読メッセージ カウンターが正しい数の未読メッセージを返しません。修正方法がわかりません。私のコードで何が問題になっていますか? ありがとう。