Dav*_*ton 2 postgresql activerecord ruby-on-rails arel
所以,我做的事情如下:
user.students.includes(:exams).ungraded.paginate(:page =>
params[:page]).order("exams.created_at desc")
Run Code Online (Sandbox Code Playgroud)
但是,这会导致一个微妙的问题.在活跃记录的内容中,限制使其在学生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;
Run Code Online (Sandbox Code Playgroud)
但是,这可能会导致以下结果:
id | alias_0
----+---------
42 | 256
42 | 257
42 | 260
Run Code Online (Sandbox Code Playgroud)
看到问题?最终这个限制开始了,我们没有像我们应该那样获取尽可能多的学生ID,因为我们通过选择学生ID和考试ID来"使用它们",即使我们真的只想要考试ID排序.
这是Rails 3.2.1和PostgreSQL 9.1.
编辑
我认为正在发生的事情是,paginate正在使用查询来获取学生列表,然后将其提供给第二个查询,但由于左外连接,我们没有为学生获得明显的结果,所以它'底部填充'我们拥有的10个插槽并且通常会混淆一些东西.我认为这是某个地方的错误,但我不确定是谁将其固定.
好吧,我终于明白了:
user.students.joins("left outer join exams on exams.student_id = students.id").ungraded.paginate(:page =>
params[:page]).order("exams.created_at desc")
Run Code Online (Sandbox Code Playgroud)
似乎工作.我不确定为什么这比使用'includes'更好,但确实如此.
| 归档时间: |
|
| 查看次数: |
1839 次 |
| 最近记录: |