订购字母数字字符串的方式

时间:2018-09-12 21:25:13

标签: ruby-on-rails ruby natural-sort

我在列上有一系列具有以下值的模型对象:

  • 2018-A-1
  • 2018-A-10
  • 2018-A-2
  • 2018-A-100
  • 2018-A-11
  • 2018-B-1
  • 2018-B-10
  • 2018-B-2
  • 2018-B-100
  • 2018-A-11

我想查询数据库并以字母数字顺序获取结果。我想按以下顺序获得结果:

  • 2018-A-1
  • 2018-A-2
  • 2018-A-10
  • ...

相反,我获得了以下顺序:

  • 2018-A-1
  • 2018-A-10
  • 2018-A-100
  • ...

有什么聪明的方法可以直接通过活动记录直接达到该结果?

1 个答案:

答案 0 :(得分:1)

在这里,我将您的示例数据重新声明为数组:

example_array = %w{2018-A-1 2018-A-10 2018-A-2 2018-A-100 2018-A-11 2018-B-1 2018-B-10 2018-B-2 2018-B-100 2018-A-11}

对我来说,这还不是很清楚。如果您尝试仅根据最后一个连字符后面的数字进行排序,则应该可以:

example_array.sort_by{|e| e.split("-").last.to_i }

如果您还打算在最终数字前加上字母,也许这就是您想要的:

example_array.sort_by{|e| [e.split("-")[-2], e.split("-").last.to_i] }