Ruby on Rails 3:基于ActiveRecord数据的排序数组

时间:2011-11-22 14:07:49

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个数组,它是来自一个ActiveRecord表的ID。 所以我想根据与该ID相关联的姓氏对该数组进行排序......我该怎么做? 澄清: array @ students = [],里面是ID,我想按Student.find(ID).last排序 谢谢。 Dorijan

3 个答案:

答案 0 :(得分:5)

如果你没有完全理解这个问题,如果给你一个id列表,你可以在进行查询时按last_name排序:

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数组。但是,我真的不知道你在幕后发生了什么,我不确定你要求的是什么。

答案 1 :(得分: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),这样就不会从数据库中提取学生记录的每一列。

答案 2 :(得分:0)

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