Rails - 作为嵌套行为 - 不可能的移动,目标节点不能在移动的树内

问题描述 投票:6回答:4

我正在使用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上复制它。

谢谢

ruby-on-rails ruby-on-rails-3 nested
4个回答
9
投票

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-任何想法为什么我得到这个“不可能的移动......”错误已经解释了为什么你得到这个错误。您可以通过使用来移动任何移动检查此移动是否有效,从而防止发生此错误

move_possible?


5
投票

由于数据库中的nil lftrgt字段,可能会出现此问题。

试试跑步

Model.rebuild!

在你的rails c这将重新计算与awesome_nested_set相关的所有值。


2
投票

我们在数据库名称parent_id中有一列,检查它对你来说不是零。


0
投票

您的数据可能已损坏。

检查你的lft值是否都小于你的rgt值。我尝试将sibiling(已经在正确的位置)移动到另一个节点的右侧时发生此错误。我感到很困惑,直到我注意到数据以某种方式被破坏了。

© www.soinside.com 2019 - 2024. All rights reserved.