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

AnA*_*ice 6 nested ruby-on-rails ruby-on-rails-3

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我这样做是为了防止水平变深.任何想法为什么我得到这个"不可能的移动,目标节点不能在移动树内".错误?有什么奇怪的是它发生在生产上但我不能在Dev上复制它.

谢谢

Nav*_*eed 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
Run Code Online (Sandbox Code Playgroud)

现在在这个树中你可以FruitMeet节点的子节点中移动整个树但是你不能Fruit在任何子节点中移动Node Fruit因为它会产生循环关系并且不可能在树上迭代.

现在让我们回到你的问题

1 - 我这样做是为了防止级别变深你不需要担心树的级别,因为awesome_nested_set可以在单个SQL查询中加载整个子树,请参阅链接1他如何处理它

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

move_possible?


Iva*_*sov 5

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

试试跑步

Model.rebuild!
Run Code Online (Sandbox Code Playgroud)

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