Ну, вы можете попробовать добавить дополнительное поле, как list_index
Тогда в before create
обратном вызове в модели вы можете:
def set_index
list_index = self.class.last_index + 1
end
def self.last_index
self.order(list_index: :desc).first.list_index
end
Затем на смену позиции:
def change(current_index)
self.class.where(self.class.arel_table[:list_index].gte(current_index)).update_all('list_index = list_index + 1')
self.update(list_index: current_index)
end
Вы можете переместить выделение элементов с более высоким индексом в область действия:
scope :after_index, ->(current_index) { where(self.arel_table[:list_index].gte(current_index)) }