0

我在称为节点的模型上使用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

创建孩子时出现问题。所以它是一个新节点,只有一个父节点,但没有左右值。我现在没有获取新节点的根节点,而是获取它的父节点的根节点,这当然是相同的。所以自定义上面的验证现在有效。

谢谢

4

1 回答 1

0

使用自定义验证方法检查别名是否尚未被同一根的节点后代使用:

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
于 2012-02-10T14:24:36.180 回答