Не уверен, что понимаю ваш вопрос, но я предполагаю, что вы мысленно разбираете идентификаторы на компоненты (поэтому 345B22 - это 345, B, 22), а затем хотите числовую сортировку для вещей, которые являются числами (т.е. 12> 2) и сортировка строк для вещей, которые являются строками (AB Если это то, что вы намереваетесь, то что-то вроде следующего поможет:
ids.sort_by do |id|
id.scan(/\d+|[a-zA-Z]+/).map {|c| c =~ /\d/ ? c.rjust(20) : c.ljust(20) }.join
end
Чтоон извлекает все последовательные числа или буквы, а затем выравнивает их вправо или влево в зависимости от их типа, объединяет результат и затем сортирует по этому (расширенному и канонизированному) идентификатору.