Rails - 使用字符串" 9th"对下拉列表进行排序来之前" 10th"

时间:2016-10-01 16:38:23

标签: ruby-on-rails

我有这行代码用于对下拉列表中的记录进行排序:

<% @classrooms.order(:classroom_name).each do |classroom| %>

它在大多数情况下工作正常,但在很多情况下我在下拉列表中有以下值:

10th Grade - Smith
11th Grade - Johnson
12th Grade - Roberts
9th Grade - Oneil

问题在于系统假设首先应该对第一个字符进行排序,然后对下一个字符进行排序,依此类推。

有没有一种简单的方法来处理这个问题而不从字母中删除数字,分别对数字进行排序并将它们连接在一起?感谢。

2 个答案:

答案 0 :(得分:0)

快速而肮脏的方法是使用sort_by

classrooms = ['10th', '9th', '11th', '8th']
=> ["10th", "9th", "11th", "8th"]
list = %w{8th 9th 10th 11th}
=> ["8th", "9th", "10th", "11th"]
classrooms.sort_by { |e| list.index(e) || list.length }
=> ["8th", "9th", "10th", "11th"]

答案 1 :(得分:0)

如果您确定只有指定格式的课堂名称,那么您可以使用 postgres substring 并对数字进行排序。像这样:

@classrooms.order("(substring(classroom_name, '(^[0-9]+)'))::int")

上面的查询将按照classroom_names的第一个数字子串10,11,12,9订购结果。

但是,我建议您打破专栏并引入新列,例如成绩。因为 classroom_name 包含的信息不仅仅是名称。