2013-06-12 13 views
25

Ruby 1.9.3p392を実行しています。ruby​​ sort_by複数のフィールド

Item = Struct.new(:name, :dir, :sort_dir) 

entries = ftp.list() 
entries.map!{|e| Net::FTP::List.parse(e) }.map!{|e| Item.new(e.basename, e.dir?, (e.dir? ? 0 : 1)) } 

render json: entries.sort_by{ |e| [ e.sort_dir, e.name ]} 

何らかの理由で、結果が期待どおりに戻っていません。

すべてのフォルダのあとにすべてのファイルが続きますが、名前の並べ替えに失敗しています。

例として、私は自分のフォルダに対してこれらを取得する:

  1. コンテンツ
  2. 画像
  3. ビン

ファイルの場合:

  1. Global.asaxの
  2. web.configファイル
  3. favicon.icoを

ITグループは、dir/fileの部分に正しいが、名前が間違って並べ替えられています。コンソールへ

出力はソートした後、次のようになります

#<struct FtpController::Item name="Content", dir=true, sort_dir=0> 
#<struct FtpController::Item name="Images", dir=true, sort_dir=0> 
#<struct FtpController::Item name="Scripts", dir=true, sort_dir=0> 
#<struct FtpController::Item name="Views", dir=true, sort_dir=0> 
#<struct FtpController::Item name="bin", dir=true, sort_dir=0> 
#<struct FtpController::Item name="Global.asax", dir=false, sort_dir=1> 
#<struct FtpController::Item name="Web.config", dir=false, sort_dir=1> 
#<struct FtpController::Item name="favicon.ico", dir=false, sort_dir=1> 
#<struct FtpController::Item name="packages.config", dir=false, sort_dir=1> 
#<struct FtpController::Item name="robots.txt", dir=false, sort_dir=1> 

答えて

52

あなたのソートは、MRIのRuby 1.8.7、1.9.3、および2.0.0で正しく動作:

Item = Struct.new(:name, :dir, :sort_dir) 

entries = [Item.new('favicon.ico', false, 1), Item.new('bin', true, 0), 
      Item.new('web.config', false, 1), Item.new('images', true, 0), 
      Item.new('global.asax', false, 1), Item.new('content', true, 0)] 

entries.sort_by{|e| [e.sort_dir, e.name]} 
# => [#<struct Item name="bin", dir=true, sort_dir=0>, 
#  #<struct Item name="content", dir=true, sort_dir=0>, 
#  #<struct Item name="images", dir=true, sort_dir=0>, 
#  #<struct Item name="favicon.ico", dir=false, sort_dir=1>, 
#  #<struct Item name="global.asax", dir=false, sort_dir=1>, 
#  #<struct Item name="web.config", dir=false, sort_dir=1>] 

を持っていますsort_byの結果をコンソールに出力しようとしましたか?私はあなたのコードのrender json:部分に慣れていませんが、おそらくそれは物事がうまくいかない場所です。私の最高の推測は、何とかJSONへの変換(それが何であれ)ソートが乱れているということです。

私の他のアイデアは、おそらくsort_byentriesを修正すると予想しているということです。それはしません。呼び出し後にentries自体をソートする場合は、sort_by!を使用してください(メソッド名の最後に!があることに注意してください)。

更新:大文字と小文字を区別しない検索が必要な問題があるようです。 upcaseを追加するだけで、このトリックを行う必要があります。

entries.sort_by{|e| [e.sort_dir, e.name.upcase]} 
+0

コンソールの出力を元の質問に含めました。また、エントリ自体がソートされることは期待していません。ソートされたリストをレンダリングメソッドに戻すことを期待しています。しかし、私が戻ってきたコンソールとコンソールの出力が一致します。 – Mike

+0

@Mike問題は大文字小文字の区別が必要な場合があります。あなたの出力はソートされているので、最初は大文字だけです。 –

+0

あなたのコメントを回答として追加することができますので、私はそれが正しいと投票することができます。私は名前にダウンケースを追加し、期待どおりに動作しています。ありがとう! – Mike

関連する問題