will_paginate,包括和连接表的排序

时间:2012-02-20 15:36:18

标签: ruby-on-rails postgresql activerecord arel

所以,我正在做类似的事情:

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

然而,这会导致一个微妙的问题。在活跃记录的内容中,限制使其在学生ID上做了明显的,如下所示:

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个插槽,并且通常会让事情变得混乱。我认为这是一个错误的地方,但我不确定是谁将它固定下来。

1 个答案:

答案 0 :(得分:5)

好的,我终于明白了:

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

似乎工作。我不确定为什么这比使用'包含'更好,但确实如此。