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:
- contenu
- images
- bin
Pour les fichiers:
- mondial.asax
- web.config
- 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>
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]}