У меня есть приложение Ruby on Rails 3, которое использует гем ancestry для предоставления иерархической древовидной структуры модели в в сочетании с гемом acts_as_list для обеспечения явного позиционирования на каждом уровне иерархии.
class Obj < ActiveRecord::Base
...
has_ancestry
acts_as_list scope: [:ancestry]
...
end
Кроме того, я использую следующий метод для объекта, чтобы изменить родителя объекта:
# Credit to the author of the ancestry gem for the code.
def move_to_child_of(reference_instance)
transaction do
remove_from_list
self.update_attributes!(:parent => reference_instance)
add_to_list_bottom
save!
end
end
Все работает так, как ожидалось, когда:
- Изменение положения объекта внутри одного и того же родителя.
- Изменение родителя объекта, когда у объекта нет потомков.
Проблема, с которой я столкнулся, заключается в том, что изменение родителя объекта, у которого также есть потомки, приводит к тому, что acts_as_list
не только меняет положение объекта, но также меняет положение всех объектов-потомков. Это приводит к тому, что положение всех объектов-потомков становится ненадежным и вызывает ненужные вызовы базы данных.
Есть ли способ предотвратить это, или это ожидаемое поведение?
Любая помощь будет принята с благодарностью; Спасибо!