Ответ 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]}