<分区>
我正在 Rails 4 上创建一个简单的聊天应用程序。创建了 Controller 、模型和 View ,但功能仍然不完整。我的数据库中有 2 个表,对话和消息。 session 表包含两个字段,发送者 ID 和接收者 ID。 messages 表包含 3 个字段,body,user id 和 read(默认为 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
我想做的是创建一个实时功能,当有人收到新消息时,接收未读消息计数。我正在使用私有(private)酒吧来创建用户之间的聊天。
我有一个包含此功能的用户模型:
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
我有一个页面,其中列出了所有用户的对话,点击一个对话,也列出了与该对话相关的所有消息。在同一页面上,我订阅了每个 conversation_messages_path
为每个对话创建单独的 channel 。每当发送消息时,都会呈现一个 create.js.erb
文件,我会在其中发布到那些订阅的 channel :
<% 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")
是我想显示未读消息数的地方。
目前,未读消息计数返回错误的计数,导航栏仅在 conversation.sender_id
消息接收方时更新。
我的未读消息计数器未返回正确数量的未读消息。我不知道如何解决它。我的代码有什么问题? 谢谢。