我在称为节点的模型上使用acts_as_nested_set。数据库中存储了多个列表,每个列表都从根节点开始。根节点没有父节点,这就是我知道它是根的方式。
现在这一切都按预期工作,但问题是:
所有节点都有一个别名,该别名在该列表中必须是唯一的。
因此,根的所有子节点都有一个唯一的别名,但所有节点都在一个数据库表中。
有谁知道仅在节点所在的树中检查唯一性的解决方案?
编辑:
正如 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
创建孩子时出现问题。所以它是一个新节点,只有一个父节点,但没有左右值。我现在没有获取新节点的根节点,而是获取它的父节点的根节点,这当然是相同的。所以自定义上面的验证现在有效。
谢谢