2016-09-05 17 views
2

長さ別にアルファベット順に並べ替えようとしています。私はアルファベット順に並べます、私は、フォームの代わりにページ分けされたリストを長さで並べ替え、RoRアプリケーションでアルファベット順に並べ替えます

Troop 1  
Troop 11  
Troop 111 
Troop 1111 
Troop 5  
Troop 55  
Troop 555 
Troop 7  
Troop 77  
Troop 777 

のリストを取得する場合、私は、単純なソートを行うことは名前の長さに基づいて、その後、トリックを行うだろうアルファベット順に名前を付けることを考えていた

Troop 1 
Troop 5 
Troop 7  
Troop 11  
Troop 55  
Troop 77  
Troop 111 
Troop 555 
Troop 777 
Troop 1111 

をしたいと思いますしかし、私は長さを分類することはできません。私はフォームのいくつかのバリエーションを試しました

def index 
    @title = 'Units' 
    @units = Unit.paginate(page: params[:page]).order(name: :asc).sort{|x, y| x.name.length <=> y.name.length} 
end 

無駄なことはありません。私は空間上で分割し、2番目の値(すなわち、数を取得)でソートする必要があるかもしれないと私にはわかりますが、その方法もわかりません。どんな助けでも大歓迎です!

答えて

2

これは、通常、プログラミングでは「Natural sorting」と呼ばれています。

ありがたいことに、あなたはRubyでそれを行う必要はありません。 SQLは十分です:

@units = Unit.paginate(page: params[:page]).order("LENGTH(name) ASC, name ASC") 
+0

魅力的なように働いています。助けてくれてありがとう! – mjswartz

+0

実際、あなたが手伝ってくれる面白いものが見つかりました。リストに 'Crew 123'を追加すると、それは 'Troop 7'と 'Troop 11'の間に置かれます。スペースで分割し、分割配列の最初の項目でアルファベット順にソートし、分割配列の2番目の項目で数値でソートすることはできますか? – mjswartz

+0

'.sort {| x、y | x = x.split( ''); y = y.split( ''); x [0] == y [0]? x [1] <=> y [1]:x [0] <=> y [0]} 'おそらく – Ven

関連する問題