Ваша логика для назначения позиции ошибочна, если шаги могут быть произвольно добавлены и удалены.
например.
- Я создаю учебник и 3 шага, с позициями [1,2,3].
- Затем я удаляю шаг с позиции 2.
- Теперь осталось 2 шага с позициями [1,3].
- Позже я создаю еще один шаг, которому присваивается позиция 3.
- Теперь есть три шага, но их позиции [1,3,3]. Это не правильно!
Есть несколько подходов, которые я бы рассмотрел, чтобы исправить ситуацию:
Первый путь
Вы можете сохранить свой код для назначения позиции новому шагу, но когда шаг удален из учебника, обновите позиции, чтобы убедиться, что они последовательны. Вот эскиз того, как это будет работать.
class Tutorial
def rectify_step_positions
# reassign positions so that all the steps form a sequence
# E.g. step positions [1,3,4] become [1,2,3]
end
end
class Step
after_destroy :trigger_rectify_positions
def trigger_rectify_positions
tutorial.rectify_step_positions
end
end
Второй способ
Когда вы создаете новый шаг, вы можете назначить его позицию на 1 больше максимальной позиции среди всех существующих шагов.
def assign_position
self.position = tutorial.steps.order("position DESC").first.position + 1
end
Этот метод немного проще для реализации, чем первый. Конечно, теперь позиции не имеют такого большого значения, поскольку они не обязательно последовательны. Шаг с позицией 10 может быть вторым шагом учебника.
Заключение
Как только вы исправите свою проблему с позицией, вы можете просто заказать шаги. Брикер показал несколько способов сделать это. Лично мне нравится has_many :steps, :order => 'position'