我使用Rails实现了一个基本的聊天系统。我正在为此使用Message模型,并且我每隔X秒轮询服务器以获取新消息。当用户打开聊天页面时,所有消息都将呈现给视图。我也开始像这样的投票“工作”:
if($("#chat").length > 0) {
$.periodic({period: 5000, decay: 1.2, max_period: 60000}, function() {
$.ajax({
url: document.location.href,
dataType: 'script'
});
});
}
我的控制器看起来像这样:
def index
@messages = Message.all
respond_to do |format|
format.html # index.html.erb
format.js
end
end
index.js.erb
看起来像这样:
$("#chat li").remove();
<% @messages.each do |msg| %>
$("#chat").append("<li>" + "<%= escape_javascript msg.content %>" + "</li>");
<% end %>
我现在拥有它的方式是否正常,或者我应该返回JSON并在轮询工作中处理它?</ p>
答案 0 :(得分:2)
调用Model.all
是一个很大的危险信号。如果定义了数千或数百万条记录怎么办?您将要获取所有。
您应该做的是传递一个参数来更新您提取的最后一个ID,然后相应地确定您的消息范围。遵循这种模式可能更合理:
def index
scope = Message
if (params[:id])
# Only fetch those messages created after the last update
scope = scope.where('id > ?', params[:id])
end
# Fetch the 100 most recent messages
@messages = scope.limit(100).order('created_at DESC').all
end
如果您在客户端跟踪最大ID号,则可以将此参数传递给后续提取。
由于您只提取新记录,因此您应将这些记录附加到列表中,而不是完全替换列表。