Rails - действует как Nested - невозможно перемещение, целевой узел не может быть внутри перемещенного дерева - PullRequest
6 голосов
/ 08 марта 2011

Я использую плагин Awesome Nested Set: https://github.com/collectiveidea/awesome_nested_set

И в моей модели я делаю следующее:

 acts_as_nested_set
 after_save :ensure_max_nestedset_level
private

def ensure_max_nestedset_level 
  if self.level > 2
    self.move_to_child_of(parent.parent)
  end
end

Я делаю это, чтобы не дать уровням добраться доглубокий.Любая идея, почему я получаю этот «Невозможный ход, целевой узел не может быть внутри перемещенного дерева».ошибка?Странно, что это происходит на производстве, но я не могу повторить это на Dev.

Спасибо

Ответы [ 4 ]

9 голосов
/ 21 февраля 2012

awesome_nested_set используется для хранения иерархической структуры данных в базе данных отношений.Вот удивительная статья о том, как мы можем хранить древовидную структуру в базе данных

http://www.sitepoint.com/hierarchical-data-database/
http://www.sitepoint.com/hierarchical-data-database-2/

awesome_nested_set также использовать ту же технику для хранения древовидной структуры в базе данных, и в дереве должно бытьне циклическое отношение !!

Так что убедитесь!нет циклических родительских дочерних отношений между узлами.awesome_nested_set проверяет, может ли это движение создать циклическое отношение, оно выдаст исключение "Impossible move, target node cannot be inside moved tree."

Пример

 Food
    |\ Fruit 
    | |\Red
    | |   \Cherry 
    | |\Yellow 
    | | \Banana
    |\Meat
    | |\Beef
      |\Pork

Теперь в этом дереве вы можете переместить все дерево Fruit в потомке Meetузел Но вы не можете переместить Fruit узел в любом дочернем элементе Fruit, потому что он создаст циклическое отношение и будет невозможно перебирать дерево.

Теперь давайте вернемся к вашему вопросу

1-я делаю это, чтобы не допустить углубления уровней. Вам не нужно беспокоиться об уровнях дерева, так как awesome_nested_set может загрузить целое поддерево в одном запросе sql, см. Ссылку 1, как он его дозирует

2 - Любая идея, почему я получаю эту ошибку "Невозможное движение ..." Уже есть объяснение, почему вы получаете эту ошибку.Вы можете предотвратить возникновение этой ошибки, перед тем как перемещать любую проверку движения, если этот ход действителен, используя

<a href="https://github.com/collectiveidea/awesome_nested_set/blob/master/lib/awesome_nested_set/awesome_nested_set.rb#L412" rel="noreferrer">move_possible?</a>

5 голосов
/ 09 декабря 2013

Эта проблема может возникать из-за полей nil lft и rgt в базе данных.

Попробуйте запустить

Model.rebuild!

в вашем rails c Это пересчитает все значенияотносится к awesome_nested_set.

2 голосов
/ 18 декабря 2017

у нас есть столбец в нашей базе данных parent_id, проверьте, что это не ноль для вас.

0 голосов
/ 18 октября 2013

Ваши данные могут быть повреждены.

Убедитесь, что все ваши значения lft меньше ваших значений rgt.Эта ошибка возникла при попытке переместить сибилинг (который уже был в правильном месте) справа от другого узла.Я был озадачен, пока не заметил, что данные как-то повреждены.

...