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上复制它.
谢谢
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)
现在在这个树中你可以Fruit在Meet节点的子节点中移动整个树但是你不能Fruit在任何子节点中移动Node Fruit因为它会产生循环关系并且不可能在树上迭代.
现在让我们回到你的问题
1 - 我这样做是为了防止级别变深你不需要担心树的级别,因为awesome_nested_set可以在单个SQL查询中加载整个子树,请参阅链接1他如何处理它
2-任何想法为什么我得到这个"不可能的移动......"错误已经解释了为什么你得到这个错误.您可以通过使用来移动任何移动检查此移动是否有效,从而防止发生此错误
由于数据库中的nil lft和rgt字段,可能会出现此问题.
试试跑步
Model.rebuild!
Run Code Online (Sandbox Code Playgroud)
在你的rails c
这将重新计算与之相关的所有值awesome_nested_set.
| 归档时间: |
|
| 查看次数: |
2733 次 |
| 最近记录: |