Rails: Gems Ancestry + Acts_as_List не работают должным образом при изменении родительского объекта

У меня есть приложение 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 не только меняет положение объекта, но также меняет положение всех объектов-потомков. Это приводит к тому, что положение всех объектов-потомков становится ненадежным и вызывает ненужные вызовы базы данных.

Есть ли способ предотвратить это, или это ожидаемое поведение?

Любая помощь будет принята с благодарностью; Спасибо!


person dSquared    schedule 13.08.2015    source источник


Ответы (1)


Похоже, что эта проблема уже известна согласно этому отчету о проблеме и имеет запрос на вытягивание с его адресацией. В качестве краткосрочного исправления я последовал предложению Брендона, опубликованному в запросе на вытягивание, и обошел ошибку, объявив пользовательскую область действия, тем самым обойдя метод scope_changed?, где существует ошибка.

Надеюсь, это поможет кому-то в будущем сэкономить время и седые волосы.

person dSquared    schedule 27.08.2015
comment
Я сам сталкиваюсь с этой проблемой (PR все еще открыт). Я не думаю, что у вас все еще есть код, и вы могли бы опубликовать суть? Я только что добавил два метода (scope_condition и scope_changed из github.com/swanandp/acts_as_list /issues/ ), и в моих собственных тестах кажется, что проблемы исчезают, но я подозреваю, что что-то упускаю. У вас все еще был acts_as_list scope: [:ancestry] ? Вы написали собственный метод move? - person patrickdavey; 15.06.2017