2012-02-20 48 views
2

所以,我做這樣的事情:will_paginate,包括和順序由連接表

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

然而,這會導致一個微妙的問題。某處在活動記錄的膽量,限制使得它做對學生證的一個獨特的,就像這樣:

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 | alias_0 
----+--------- 
42 |  256 
42 |  257 
42 |  260 

看這個問題?最終,限制開始了,我們並沒有像我們所期望的那樣獲取儘可能多的學生ID,因爲我們通過選擇學生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") 

似乎工作。我不確定爲什麼這會比使用'includes'更好,但它確實如此。