我正在使用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上复制它。
谢谢
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-任何想法为什么我得到这个“不可能的移动......”错误已经解释了为什么你得到这个错误。您可以通过使用来移动任何移动检查此移动是否有效,从而防止发生此错误
由于数据库中的nil
lft
和rgt
字段,可能会出现此问题。
试试跑步
Model.rebuild!
在你的rails c
这将重新计算与awesome_nested_set
相关的所有值。
我们在数据库名称parent_id中有一列,检查它对你来说不是零。
您的数据可能已损坏。
检查你的lft值是否都小于你的rgt值。我尝试将sibiling(已经在正确的位置)移动到另一个节点的右侧时发生此错误。我感到很困惑,直到我注意到数据以某种方式被破坏了。