新手问题 ActiveRecord 如何根据 association 排序

xmonkeycn · 2012年11月06日 · 最后由 xmonkeycn 回复于 2012年11月06日 · 2566 次阅读

有Student,Exam,Result三个类,学生会考0-n门考试,得到0-n个成绩

Student

class Student < ActiveRecord::Base
   has_many :exams, :through => :results
   has_many :results

Exam

class Exam < ActiveRecord::Base
   attr_accessible name
   has_many :students, :through => :results
   has_many :results

Result

class Result < ActiveRecord::Base
   attr_accessible score
   belongs_to :student
   belongs_to :exam

比如我想对学生按照ruby的考试成绩排序,可以这么写:

Student.includes(:results).where('results.exam_id ='+Exam.find_by_name('ruby').id.to_s).order('results.score DESC')

(中间的where写的很丑,有没有更好的写法?)

但是这样只会得到参加过ruby考试的学生的列表,没有ruby成绩的学生不会返回。 如何获得包含所有学生的列表,按照ruby成绩排序,并且把没有ruby成绩的同学排在最后面呢?

谢谢。

共收到 6 条回复
ruby_exam = Exam.find_by_name('ruby')
ruby_exam.results.includes(:user).order('results.score DESC')

#1楼 @fresh_fish

谢谢,这样写好看多了。

我试了一下,这样返回的是ruby成绩列表,而不是学生列表。 没有ruby成绩学生还是不在列表中。

ruby_exam.results.includes(:user).order('results.score DESC').collect{ |result| result.user }

class Customer < ActiveRecord::Base has_many :recent_orders, :class_name => "Order", :order => "order_date DESC", :limit => 100 end

Student.includes(:results).where('results.exam_id =?',Exam.find_by_name('ruby').id).order('results.score DESC')

#3楼 @fresh_fish #5楼 @woaigithub 谢谢,这两个结果还是只有参加过ruby考试的student,没参加过的就木有了-,-

是不是应该对students直接sort_by呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册