0

我的表中有一列是代码。它们的格式为 AAA-XXXX-YYYwhere

  • AAA是按字母顺序排列的
  • XXX是数字
  • YYY是数字

我想对我的 default_scope 使用字母排序AAA,然后是数字排序XXXX,然后是数字排序,YYY所以当我索引它们时,它们会像这样排序。

如果我对列进行字母数字排序,我将得到以下结果:

AAA-1000-1
AAA-1000-111
AAA-1000-2
BB-1000-12
BBB-1000-1
BCA-1000-1
C-1000-12

但 111 大于 2 使用数字排序。

编辑:AAA 的长度不固定。所以它可能是“AA”或“BBBB”或“CCC”。已经提到使用 SQL SUBSTRING,但位置并不总是设置。

EDIT2:我可能应该提到这种排序需要在 default_scope 上完成,所以当我访问 Object.all 时,它们默认以这种方式排序。

谢谢你的帮助!

4

1 回答 1

0
arr = ['AAA-1000-1','AAA-1000-111','AAA-1000-2','E-3-3','E-2-3','CCCC-2-45']

arr.sort_by {|elm| "%10s%10i%10i" % elm.split('-') }

=> ["E-2-3", "E-3-3", "AAA-1000-1", "AAA-1000-2", "AAA-1000-111", "CCCC-2-45"] 
于 2012-12-20T11:42:49.770 回答