Миксы act_as_list в Rails обрабатывают это в основном так, как вы описали в # 1. Он ищет столбец INTEGER с именем position (из которого вы можете переопределить name) и использует его для выполнения ORDER BY. Когда вы хотите изменить порядок вещей, вы обновляете позиции. Он прекрасно мне служил каждый раз, когда я его использовал.
В качестве примечания, вы можете избавиться от необходимости всегда делать повторное позиционирование на ВСТАВКАХ / УДАЛЕНИЯХ, используя разреженную нумерацию - что-то вроде базовых значений в тот день ... вы можете нумеровать свои позиции 10, 20, 30 и т. д., и если вам нужно вставить что-то между 10 и 20, вы просто вставляете это с позицией 15. Аналогично, при удалении вы можете просто удалить строку и оставить пробел. Вам необходимо выполнять повторную нумерацию только тогда, когда вы действительно меняете порядок или если вы пытаетесь выполнить вставку, и в ней нет подходящего пробела для вставки.
Конечно, в зависимости от вашей конкретной ситуации (например, есть ли у вас другие строки, уже загруженные в память или нет), может иметь или не иметь смысл использовать подход с пропуском.