rails acts_as_nested_set具有唯一性

时间:2012-02-10 14:09:03

标签: ruby-on-rails validation unique acts-as-nested-set

我在名为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

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

由于

1 个答案:

答案 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