2010-06-03 5 views
1

특정 리소스에 대한 모든 레코드를 찾아 무작위 순서로 표시하지만 일관된 페이지 매김이 필요합니다 (페이징을 시작하면 동일한 레코드가 두 번 표시되지 않음). 표시 순서는 사용자가 페이지를 방문 할 때마다 무작위로 지정되어야합니다. will_paginate을 사용 중입니다. 어떤 충고? 당신이 RAND()으로 이러한 RANDOMIZE 기능이 MySQL과 같은 데이터베이스를 사용하는 경우Rails 페이지 매김이있는 임의의 활성 레코드

답변

4

사용자 세션 쿠키에 임의의 숫자를 저장 한 다음 데이터베이스 임의 함수의 시드로 사용합니다. 이것은 사용자가 브라우저를 닫을 때까지 동일하고, 것, 따라서 그들은 모두 임의의 일관된 기록이 표시됩니다

cookies[:seed] = SecureRandom.random_number.to_s[2..20].to_i 

사용 예를 들어,이 씨 :

큰, 임의의 숫자를 얻기를 MySQL은 :

SomeModel.all.order("RAND ?", cookies[:seed]) 
+0

업데이트 : 방금 한 가지를 깨달았습니다. 임의의 시드를 URL의 일부로 만들어야 사용자가 북마크를 저장하거나 URL을 저장하면 페이지 매김이 중단되지 않습니다. 그런 다음 씨앗을 할 수 있습니다. || params [: seed] || session_seed – Houen

1

, 당신은 다음처럼 매김 쿼리에 그것을 추가 할 수 있습니다

Resource.paginate(... :order => "RAND()" ...) 

체크 아웃 여기에 대한 의견의 일부를 성능 문제 : https://rails.lighthouseapp.com/projects/8994/tickets/1274-patch-add-support-for-order-random-in-queries

+0

. 페이지를 변경할 때 (즉, 1에서 2로) 쿼리가 두 번 실행되고 중복 된 항목이 표시 될 수 있습니다 (1 페이지의 항목이 2 페이지에도 표시됨). –

+0

각 페이지의 항목을 무작위로 원한다는 의미라고 생각했습니다. 이전에 열람 한 페이지를 세션 배열에 저장하고 다음 요청시이를 필터링 할 수는 있지만 실제로는 해킹하고 부서지기 쉬운 것처럼 보입니다. –

+0

그래, 그건 아주 좋은 해결책 같지 않아. 나는 더 나은 것이 존재하지 않는다는 것에 약간 놀랐다. 이전에 http://sortfolio.com/과 같은 Ruby on Rails 응용 프로그램에서 구현 된 것을 보았습니다. –

2

이것은 내 지식에 표준이 아닙니다. 예를 들어 온라인 테스트에서이를 사용할 수 있습니다.

세션/사용자별로 목록을 사용하는 것이 좋습니다. 따라서 사용자가 처음 페이지로 이동하면 임의의 순서로 ID 목록을 결정하고이 목록을 사용하여 해당 사용자/세션에 대한 올바른 순서를 표시하는 모든 연속보기를 결정합니다.

행의 양이 제한되어 있기를 바랍니다. 예를 들어, 테스트의 경우처럼 말이됩니다. 또한 사용자가 완전히 끝내기 전에 테스트를 끝내면 중단 한 부분부터 계속할 수 있습니다. 그러나 아마도 그것은 당신과 관련이 없습니다.

희망이 도움이됩니다.

1

아직 도움이 필요한지 잘 모르겠습니다. 과거에 한 가지 해결책은 처음에는 RAND로 쿼리를 수행했지만 페이지 매김없이 수행하는 것입니다. 그런 다음 해당 레코드 ID를 저장하고 저장된 목록을 사용하여 조회하고 페이지 매김하십시오. 초기 RAND 쿼리는 페이지가 1이거나 nil 일 때만 실행되도록 설정할 수 있습니다. 그냥 생각.

+0

아이디어를 제공해 주셔서 감사합니다.나는 이것을 오랫동안 보지 않았고 더 이상 어디에서 사용되었는지 기억할 수 없다! 나는 대답을 고맙게 생각한다. –

0

나는 종료 업 포스트 그레스에 나를 위해 일한이 솔루션이 작동하지 않습니다

session[:seed] ||= rand() # should be between [-1..1] 
seed = session[:seed] 
Product.select("setseed(#{seed})").first 
Product.order('random()').limit(10).offset(params[:offset]) 
관련 문제