Подтвердить что ты не робот

Ruby sort_by несколько полей

Я запускаю 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 ]}

По какой-то причине я не верну результаты, как ожидалось.

Сначала я получаю все папки, за которыми следуют все файлы, однако сортировка имени не работает.

В качестве примера я получаю их для своих папок:

  • Содержание
  • изображения
  • бен

Для файлов:

  • global.asax
  • web.config
  • favicon.ico

Он группирует часть файла/файла правильно, но имена сортируются некорректно.

Вывод на консоль выглядит следующим образом:

#<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>
4b9b3361

Ответ 1

Ваша сортировка работает правильно в 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_by изменит entries; Это не. Если вы хотите, чтобы entries сам сортировался после вызова, используйте sort_by! (обратите внимание на ! в конце имени метода).

Обновление: Похоже, проблема заключается в том, что вы хотите искать без учета регистра. Просто добавление upcase должно выполнить трюк:

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