2012-02-10 60 views
0

我在一个叫node的模型上使用acts_as_nested_set。 数据库中存储了多个列表,每个列表都以根节点开始。 根节点没有父节点,这就是我知道它是根节点的原因。rails acts_as_nested_set唯一性

现在这个预期所有的作品,但问题是这样的:

所有节点有一个别名,它需要在该列表独特

所以,根的所有的孩子都有唯一的别名,但所有节点都在一个单一的数据库表。

有谁知道只有在树的节点是在检查的独特的解决方案?

编辑:

由于Baldrick指出我会使用自定义的验证是关好。问题是,在验证根返回零。如下图所示:

class Baco::Node < ActiveRecord::Base 

    set_table_name "baco_nodes" 

    acts_as_nested_set :order => :position 

    acts_as_list :scope => :parent_id 

    default_scope order("parent_id, position") 

    validate :alias_uniqueness 

    def alias_uniqueness 

    p self.parent.parent  # return the root 
    p self.parent    # returns the parent 
    p self.root    # returns nil 

    if parent.nil? 
     root = self 
    else 
     root = self.parent.root 
    end 

    if root.descendants.index { |node| node != self && node.alias == self.alias } 
     errors.add(:alias, "Alias already used") 
    end 
    end 

end 

EDIT 2

问题创建一个孩子时出现。所以这是一个新的节点,只有一个父节点,但没有左和右值。而不是获取新节点的根,现在我得到它的父节点的根,这当然是相同的。所以自定义现在验证上面的作品。

感谢

回答

0

使用custom validation方法来检查该别名尚未使用的同根的节点descendant

class Node < ActiveRecord::Base 
    validate :alias_uniqueness 

    def alias_uniqueness 
    if self.root.descendants.index {|node| node != self && node.alias == self.alias} 
     errors.add(:alias, "Alias already used") 
    end 
    end 

    ... 
end 
+0

我不认为这会工作,因为根本方法获取数据库中的第一个根。问题是我在一张桌子上有多棵树。虽然自定义验证可能是我唯一的选择,但我会尝试并调整它,并让您知道如何解决。谢谢 – 2012-02-10 14:30:09

+0

'self.root'应该获取当前节点的根目录。 – Baldrick 2012-02-10 14:33:27

+0

哦,那太棒了!我正在查找awesome_nested_set的源代码,发现根方法(粘贴在我的文章中),但它似乎没有得到正确的根。现在,当进一步查看时,我看到有另一个根方法(也在我的文章中)。 – 2012-02-10 14:41:32