for - ruby invert sort
ruby sort_by multiple fields (1)
Su clasificación funciona correctamente en MRI Ruby 1.8.7, 1.9.3 y 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>]
¿Has intentado enviar el resultado de tu sort_by
a una consola? No estoy familiarizado con el render json:
parte de tu código, pero quizás es allí donde las cosas van mal. Mi mejor suposición es que de alguna manera en la conversión a JSON (si eso es lo que hace) la clasificación se está arruinando.
Mi otra idea es que quizás esperas que sort_by
modifique las entries
; no es asi. Si desea que las entries
se sort_by!
después de la llamada, use sort_by!
(observe el !
al final del nombre del método).
Actualización: Parece que el problema es que desea una búsqueda insensible a mayúsculas y minúsculas. Simplemente agregando upcase
debería hacer el truco:
entries.sort_by{|e| [e.sort_dir, e.name.upcase]}
Estoy ejecutando 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 ]}
Por alguna razón, no estoy obteniendo los resultados como se esperaba.
Obtengo primero todas las carpetas seguidas por todos los archivos, sin embargo, la clasificación del nombre está fallando.
Como ejemplo, obtengo estos para mis carpetas:
- contenido
- imágenes
- compartimiento
Para archivos:
- global.asax
- web.config
- favicon.ico
Agrupa la parte dir / file correcta, pero los nombres están ordenados incorrectamente.
La salida a la consola se ve así después de la clasificación:
#<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>