所以,我正在做类似的事情:
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个插槽,并且通常会让事情变得混乱。我认为这是一个错误的地方,但我不确定是谁将它固定下来。
答案 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")
似乎工作。我不确定为什么这比使用'包含'更好,但确实如此。