Чтобы ответить на ваш первый вопрос,
Pages.update_all(:position => 0)
Один из способов обновления массива позиций при удалении позиции - обратный вызов before_destroy. Это надежно, только если метод Rails destroy
является единственным способом удаления записей!
def decrement_positions
Pages.update_all('position = position - 1', ['position > ?', position])
end
before_destroy :decrement_positions
Один свободный способ задания условий гонки для одновременного задания всех позиций в смежных значениях заключается в переходе на SQL:
Pages.update_all('position = 1 + (select count(1) from pages p where p.position < pages.position)')