Я бы просто настроил ваш вид, чтобы поставить nil
элементов в последнюю очередь. Попробуйте что-то вроде этого.
foo = [nil, -3, 100, 4, 6, nil, 4, nil, 23]
foo.sort { |a,b| a && b ? a <=> b : a ? -1 : 1 }
=> [-3, 4, 4, 6, 23, 100, nil, nil, nil]
Это говорит о том, что если a и b оба не равны нулю, сортируйте их как обычно, но если один из них равен nil, возвращайте статус, который сортирует это значение больше.