我在名为node的模型上使用acts_as_nested_set。 存储在数据库中的多个列表,每个列表都以根节点开头。 根节点没有父节点,我就知道它是根节点。
现在这一切都按预期工作,但问题是:
所有节点都有一个别名,该列表中的必须是唯一的。
因此,root的所有子节点都有一个唯一的别名,但所有节点都在一个db-table中。
是否有人知道仅在节点所在的树中检查唯一性的解决方案?
修改
正如Baldrick指出的那样,使用自定义验证我会做得很好。问题是,在验证根中返回nil。如下图所示:
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
编辑2
创建孩子时出现问题。所以这是一个新节点,只有一个父节点,但没有左右值..而不是获得新节点的根我现在得到它的父节点的根,当然会是相同的..所以自定义上面的验证现在有效。
由于
答案 0 :(得分: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