2012-07-26 3 views
5

Rails 3.2 애플리케이션에 will_paginate를 사용하려하고 db의 데이터가 변경되는 동안 누군가가 페이징 할 때 어떤 일이 발생하는지에 대한 참조가 전혀 표시되지 않았습니다. . 특히, 새로운 레코드가 추가됩니다.Rails will_paginate and ajax, DB 테이블이 변경되는 동안 페이징

여기에 뭔가가 누락되었을 수 있지만 작동 방식을 알면 will_paginate는 DB의 레코드를 계산합니다. 한 번에 5 개의 레코드가있는 페이지를로드하고 가장 최근의 레코드 순으로 정렬한다고 가정 해보십시오. 사용자가 페이지를로드하고 페이지 1에 표시되는 레코드 6-10 (그 당시 최신 레코드)을 가져옵니다. 그런 다음 다른 레코드를 id = 11 테이블에 삽입합니다. 그 후 첫 번째 사용자는 페이지 2로 이동하기 위해 클릭하지만 이제 페이지 2는 레코드 2-6을 제공합니다. 따라서 사용자는 두 페이지 모두에서 id = 6을 얻었습니다.

이 문제는 나쁜 소리하지 않지만, 다음과 같이 당신이 무한 스크롤에 대한 will_paginate 페이징을 사용하려면 정말 나쁜 : http://railscasts.com/episodes/114-endless-page

내가 첫 페이지로드의 타임 스탬프를 추가하는 방법에 대한 생각 연속 된 아약스 호출에 전달하여 중복 레코드를 가져 오지 않기 위해 처음에 있던 레코드를 필터링합니다.

이것을 처리하는 모범 사례가 있습니까?

+0

첫 번째 페이지로드 당시의 데이터 만 가져 오기 위해 타임 스탬프를 사용했습니다. – Oded

+0

그런 경우 타임 스탬프보다 최근의 레코드가 있는지 검사를 추가하고, 그렇다면 사용자가 더 최근의 결과를로드 할 수 있도록 링크를 표시 할 수 있습니다 (트위터에서이 작업을 수행하는 방법 참조). 예). – Benissimo

답변

1

타임 스탬프 검사 솔루션은 레코드 만 추가하면 작동합니다. 또 다른 대안은 반환 된 가장 오래된 레코드의 타임 스탬프를 사용하여 다음 데이터 집합을 얻는 것입니다.

그런 식으로 레코드가 삭제되면 레코드를 건너 뛰지 않습니다.

반환되는 가장 오래된 레코드의 타임 스탬프를 사용하면 쿼리 시간에 유리합니다. 데이터베이스가 101 번째 레코드를 가져 오기 위해 100 개의 레코드를 계산할 필요가 없기 때문에 특정 시간보다 오래된 첫 번째 레코드를 간단하게 가져올 수 있기 때문입니다 (created_at 열의 색인이 생성되어 이진 검색이 가능하면 훨씬 빠릅니다.

+0

안녕하세요 @ronalchn 더 많은 것을 이해할 수있는 코드 예를 작성할 수 있습니까? – medBo