2012-02-20 2 views
2

에 의해 순서는, 내가 좋아하는 뭔가를하고 있어요 :will_paginate는 포함하고 조인 된 테이블 그래서

user.students.includes(:exams).ungraded.paginate(:page => 
    params[:page]).order("exams.created_at desc") 

그러나,이 미묘한 문제가 발생합니다. 어딘가에 활성 레코드의 내장에, 한계는이 같은 학생 아이디의에 뚜렷한을 만든다 :

id | alias_0 
----+--------- 
42 |  256 
42 |  257 
42 |  260 

문제를 참조하십시오

SELECT DISTINCT "students".id, exams.id AS alias_0 FROM "students" 
LEFT OUTER JOIN "exams" ON "exams"."student_id" = "students"."id" 
WHERE "students"."ready_for_grading" = 't' ORDER BY exams.id LIMIT 10 OFFSET 0; 

그러나,이 같은 결과가 발생할 수 있습니다? 궁극적으로 한도가 높아지기 때문에 학생 ID와 시험 ID를 모두 선택하여 "사용했습니다"라는 이유로 많은 학생 ID를 가져 오지 못합니다. 주문.

이것은 Rails 3.2.1 및 PostgreSQL 9.1입니다.

편집

나는 무슨 일이 일어나고하면 해당 PAGINATE는 그 다음 두 번째 쿼리에 공급 학생들의 목록을 얻을 수있는 쿼리를 사용하고 있지만 왼쪽 외부 조인 때문에, 우리는 것 같아요 학생들을위한 뚜렷한 결과를 얻지 못하기 때문에 우리가 가지고있는 10 개의 슬롯을 "부족하게"채우고 일반적으로 혼란스럽게합니다. 나는 이것이 어딘가에있는 버그라고 생각하지만, 누가 그것을 고정해야할지 모르겠다.

답변

4

좋아, 나는 마침내 그것을 알아 냈 :

user.students.joins("left outer join exams on exams.student_id = students.id").ungraded.paginate(:page => 
    params[:page]).order("exams.created_at desc") 

가 작동하는 것 같다. 왜 이것이 '포함'을 사용하는 것보다 효과가 좋은지 잘 모르겠지만 그렇습니다.