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
问题创建一个孩子时出现。所以这是一个新的节点,只有一个父节点,但没有左和右值。而不是获取新节点的根,现在我得到它的父节点的根,这当然是相同的。所以自定义现在验证上面的作品。
感谢
我不认为这会工作,因为根本方法获取数据库中的第一个根。问题是我在一张桌子上有多棵树。虽然自定义验证可能是我唯一的选择,但我会尝试并调整它,并让您知道如何解决。谢谢 – 2012-02-10 14:30:09
'self.root'应该获取当前节点的根目录。 – Baldrick 2012-02-10 14:33:27
哦,那太棒了!我正在查找awesome_nested_set的源代码,发现根方法(粘贴在我的文章中),但它似乎没有得到正确的根。现在,当进一步查看时,我看到有另一个根方法(也在我的文章中)。 – 2012-02-10 14:41:32