【发布时间】:2012-02-10 14:09:03
【问题描述】:
我在称为节点的模型上使用acts_as_nested_set。 数据库中存储了多个列表,每个列表都从根节点开始。 根节点没有父节点,所以我知道它是根节点。
现在这一切都按预期工作,但问题是:
所有节点都有一个别名,该别名在在该列表中必须是唯一的。
因此,根的所有子节点都有一个唯一的别名,但所有节点都在一个 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
创建孩子时出现问题。所以它是一个新节点,只有一个父节点,但没有左右值。我现在没有获取新节点的根,而是获取它的父节点的根,这当然是相同的。所以自定义上面的验证现在有效。
谢谢
【问题讨论】:
标签: ruby-on-rails validation unique acts-as-nested-set