2011-11-22 67 views

回答

5

没有完全理解这个问题,如果你指定id的列表,你可以当你做查询姓氏排序:

Student.where("id IN (?)", @students).order(:last_name) 

。当然,这是假设@students是一个ID数组,没有别的。

回应你的评论,我不确定你为什么需要这样做,但是如果你的@student数组只是一个不知道Student模型及其属性的ID列表,而且你仍然想排列数组,你可以这样做:

@students = Student.where("id IN (?)", @students).order(:last_name).collect(&:id) 

这将返回一个按姓氏排序的ID数组。但是,我不知道你在幕后做了什么,我不确定你在问什么。

+0

嗨...感谢您的快速回复,但我需要对array @ students = []进行排序,而不是从ActiveRecords订购数据。例如:在我的阵列中有数字[7,13,15],并且姓氏7是Zorro,13是安东尼,15是Lovejoy,因此,最终阵列应该是[15,13,​​7] ... – user899119

+0

但也许这应该工作......我试试吧:) – user899119

+0

显然你会需要你的数组包含你想排序的数据,如果查找数据库中的数据是不允许的。 –

0
Student.find(@students).sort_by { |s| s.last_name } 
+1

这很好,但请记住它会做内存中的排序,如果你有大量的学生记录排序(特别是如果last_name列被索引的话)可能效率不高 –

2

基于您的评论,要做到以下几点:

  • 参加学生的ID的列表作为输入
  • 返回由学生的姓氏数据库命令ID列表。

你应该能够做到以下几点:

Student.where(:id => @ids).order(:last_name).map(&:id) 

打破下来:

  • where(:id => @ids)只能用ID阵列中的ID选择学生。
  • order(:last_name)按姓氏排序结果。
  • map(&:id)需要一个Students的数组,并返回ID列。基本上,括号中的方法(这是为每个学生调用id的快捷方式)被称为每个找到的学生,并且返回值被组装成一个新的数组(仅包含id)。

的一些陷阱:

  • 如果ID不存在于数据库中,它会被排除的结果 - 如果你的结果阵列比你的输入数组小,你可能试图访问不再存在的记录。
  • 如果Students表的列数很多,则可能需要考虑调用select(:id),以便不从数据库中提取学生记录的每一列。
相关问题