Я использую act_as_nested_set в модели, которая называется узел.
В базе данных хранится несколько списков, каждый из которых начинается с корневого узла.
Корневой узел не имеет родителя, поэтому я знаю, что это корень.
Теперь все это работает, как и ожидалось, но проблема в следующем:
Все узлы имеют псевдоним, который должен быть уникальным в этом списке .
Итак, все дочерние элементы корня имеют уникальный псевдоним, но все узлы находятся в одной db-таблице.
Кто-нибудь знает решение для проверки уникальности только в дереве, в котором находится узел?
EDIT:
Как указывает Болдрик, мне не очень хорошо, если бы я использовал пользовательскую проверку. Проблема в том, что при проверке root возвращает 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
Проблема возникла при создании ребенка. Так что это новый узел, у которого пока есть только родитель, но нет левого и правого значений. Вместо того, чтобы получить корень нового узла, я теперь получаю корень его родителя, который, конечно, будет таким же. проверка выше работает сейчас.
Спасибо