Если у вас не постоянно изменяемые индексы по много раз в секунду, а так же не таблица из миллиона строк, то массовый апдейт всех индексов выше или ниже нового значения вполне хорошее решение.
То есть если вы хотите вставить элемент и дать ему индекс 5, то перед вставкой вам нужно выполнить запрос
upate table_name set position = position + 1 where position >= 5
При такой схеме при удалении элемента ничего с остальными элементами делать не нужно.
Решение оставлять "зазор между индексами" в 10-100-1000 и т.д., или делать индексы дробными совершенно не приемлимо. Оно не надёжно в долгосрочной перспективе.
И да, если говорить о типовых задачах, то эта задача типовая.
Есть хорошим гем
acts_as_list, который делает как раз нужное. Использует он способ, который я описал ваше.