【问题标题】:rails acts_as_nested_set with uniquenessrails act_as_nested_set 具有唯一性
【发布时间】: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


    【解决方案1】:

    使用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
    

    【讨论】:

    • 我认为这行不通,因为 root 方法从数据库中获取了第一个 root。问题是我在一张桌子上有多棵树。虽然自定义验证可能是我唯一的选择,但我会尝试对其进行调整,让您知道效果如何。谢谢
    • self.root 应该获取当前节点的根。
    • 哦,那太好了!我正在查看 awesome_nested_set 的源代码并找到了 root 方法(将其粘贴在我的帖子中),但它似乎没有得到正确的 root。现在,当进一步看时,我发现还有另一种根方法(也在我的帖子中)..
    • 在该验证器中调用 root 返回 nil。
    • 问题是节点由于某种原因没有左右值..
    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多