0

テーブルにコードの列があります。それらは AAA-XXXX-YYYwhereの形式です。

  • AAAアルファベット順です
  • XXX数値です
  • YYY数値です

でアルファベット順の並べ替えを使用しAAA、次に で数値の並べ替えを使用し、次に default_scopeXXXXで数値の並べ替えを使用したいYYYので、それらにインデックスを付けると、そのように並べ替えられます。

列で英数字の並べ替えを行った場合、次のようになります。

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

しかし、数値ソートを使用すると、111 は 2 よりも大きくなります。

EDIT: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 に答える