0

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メッセージが受信者に届いたときにのみ更新されます。

未読メッセージ カウンターが正しい数の未読メッセージを返しません。修正方法がわかりません。私のコードで何が問題になっていますか? ありがとう。

4

1 に答える 1