【问题标题】:will_paginate, includes, and ordering by a joined tablewill_paginate、包含和按连接表排序
【发布时间】: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


    【解决方案1】:

    好吧,我终于想通了:

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

    似乎有效。我不确定为什么这比使用“包含”效果更好,但确实如此。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多