rails act_as_nested_set с уникальностью - PullRequest
0 голосов
/ 10 февраля 2012

Я использую 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

Проблема возникла при создании ребенка. Так что это новый узел, у которого пока есть только родитель, но нет левого и правого значений. Вместо того, чтобы получить корень нового узла, я теперь получаю корень его родителя, который, конечно, будет таким же. проверка выше работает сейчас.

Спасибо

1 Ответ

0 голосов
/ 10 февраля 2012

Используйте метод пользовательской проверки , чтобы проверить, что псевдоним еще не используется узлом потомком того же корня:

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
...