Ruby Trier par plusieurs champs

Je cours Ruby 1.9. 3p392.

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 ]}

Pour une raison quelconque, Je ne reçois pas les résultats comme prévu.

Je reçois d'abord tous les dossiers suivis de tous les fichiers, cependant, le tri des noms échoue.

Par exemple, je reçois ceux-ci pour mes dossiers:

  1. contenu
  2. images
  3. bin

Pour les fichiers:

  1. mondial.asax
  2. web.config
  3. favicon.ico

Il regroupe la partie dir / file correct, mais les noms sont triés incorrectement.

La sortie de la console ressemble à ceci après le tri:

#<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>
26
demandé sur the Tin Man 2013-06-13 02:20:24

1 réponses

Votre tri fonctionne correctement dans MRI Ruby 1.8.7, 1.9.3 et 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>]

Avez-vous essayé de sortir le résultat de votre sort_by sur une console? Je ne suis pas familier avec la partie render json: de votre code, mais peut-être que c'est là que les choses vont mal. Ma meilleure supposition est que d'une manière ou d'une autre dans la conversion en JSON (si c'est ce qu'il fait) le tri est foiré.

Mon autre idée est que peut-être vous attendez-vous à ce que sort_by modifie entries; ce n'est pas le cas. Si vous voulez entries lui-même à être triés après l'appel, utilisez sort_by! (notez le ! à la fin du nom de la méthode).

Update: Il semble que le problème soit que vous voulez une recherche insensible à la casse. Il suffit d'ajouter upcase devrait faire l'affaire:

entries.sort_by{|e| [e.sort_dir, e.name.upcase]}
56
répondu Darshan Rivka Whittle 2013-06-12 23:20:23