2011-04-19 1 views
0

레일스를 사용하여 기본 채팅 시스템을 구현했습니다. 나는 이것을 위해 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을 반환하고 폴링 작업에서 처리해야합니까, 아니면 지금 가지고있는 방식으로 괜찮습니까?

답변

2

Model.all 전화는 큰 붉은 깃발입니다. 수천 또는 수백만 개의 레코드가 정의되면 어떻게 될까요? 모두을 가져올 것입니다.

마지막으로 가져온 ID의 업데이트에 매개 변수를 전달한 다음 이에 따라 메시지 범위를 지정해야합니다. 이 패턴을 따르는 것이 더 합리적 일 수있다 : 클라이언트 측의 최대 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 

.

새 레코드 만 가져 오기 때문에 목록을 완전히 바꾸지 않고 목록에 추가해야합니다.

+0

한 번에 많은 정보를 가져 오는 방법으로 마지막 ID를 저장하는 방법과 장소는 어디입니까? 세션에서? – Geo

+0

일반적으로 검색된 마지막 ID는 클라이언트 측 JavaScript에 편리한 변수에 바인딩 된 영구 변수로 저장됩니다. – tadman

+0

이 저장 예를들 수 있습니까? 나는 당신이 의미하는 바가 무엇인가를 편리하게 묶는 것으로 이해하지 못합니다. – Geo