【发布时间】:2012-03-10 22:46:44
【问题描述】:
所以,我正在做类似的事情:
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 个插槽,并且通常会使事情变得混乱。我认为这是某个地方的错误,但我不确定该将其固定在谁身上。
【问题讨论】:
标签: ruby-on-rails postgresql activerecord arel