我有这行代码用于对下拉列表中的记录进行排序:
<% @classrooms.order(:classroom_name).each do |classroom| %>
它在大多数情况下工作正常,但在很多情况下我在下拉列表中有以下值:
10th Grade - Smith
11th Grade - Johnson
12th Grade - Roberts
9th Grade - Oneil
问题在于系统假设首先应该对第一个字符进行排序,然后对下一个字符进行排序,依此类推。
有没有一种简单的方法来处理这个问题而不从字母中删除数字,分别对数字进行排序并将它们连接在一起?感谢。
答案 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 包含的信息不仅仅是名称。