module MptTree

Constants

VERSION

Public Class Methods

root() click to toggle source
# File lib/mpt_tree.rb, line 37
def self.root
  name.constantize.first
end

Public Instance Methods

acts_as_tree() click to toggle source
# File lib/mpt_tree.rb, line 5
def acts_as_tree
  has_one :mpt_tree_node, :as=>:tree, :dependent=>:destroy, :class_name=>"MptTree::Node"
  default_scope lambda {joins(:mpt_tree_node).order('mpt_tree_nodes.lft')}

  class_eval do 
    def make_it_root
      create_mpt_tree_node #unless MptTree::Node.root_created? self.class.name
      self.reload
    end

    def tree
      node_ids = mpt_tree_node.tree
      self.class.name.constantize.where(:id => node_ids)
    end

    def insert(node)
      raise "can not be inserted! node already have parent." if node.mpt_tree_node
      mpt_tree_node.insert(node)
    end

    def parent
      ancestors.last
    end
    
    def siblings
      parent.nodes_at_level(level(parent)) - [self]
    end

    def children
      nodes_at_level(1)
    end
    
    def self.root
      name.constantize.first
    end

    def root?
       (level(self.class.name.constantize.first) == 0) ? true : false
    end

    def leaf?
      !children.present?
    end

    def ancestors
      node_ids = mpt_tree_node.ancestors
      self.class.name.constantize.where(:id => node_ids)
    end

    def self_with_ancestors
      ancestors << self
    end

    def level(parent=nil)
      mpt_tree_node.level(parent)
    end

    def nodes_at_level(level)
      nodes = Array.new
      tree.each do |node|
        nodes << node if node.level(self) == level
      end
      nodes
    end

    def change_parent(node)
      mpt_tree_node.destroy
      self.reload
      node.insert(self)
    end

    alias_method :<<, :insert
  end
end
ancestors() click to toggle source
# File lib/mpt_tree.rb, line 49
def ancestors
  node_ids = mpt_tree_node.ancestors
  self.class.name.constantize.where(:id => node_ids)
end
change_parent(node) click to toggle source
# File lib/mpt_tree.rb, line 70
def change_parent(node)
  mpt_tree_node.destroy
  self.reload
  node.insert(self)
end
children() click to toggle source
# File lib/mpt_tree.rb, line 33
def children
  nodes_at_level(1)
end
insert(node) click to toggle source
# File lib/mpt_tree.rb, line 20
def insert(node)
  raise "can not be inserted! node already have parent." if node.mpt_tree_node
  mpt_tree_node.insert(node)
end
leaf?() click to toggle source
# File lib/mpt_tree.rb, line 45
def leaf?
  !children.present?
end
level(parent=nil) click to toggle source
# File lib/mpt_tree.rb, line 58
def level(parent=nil)
  mpt_tree_node.level(parent)
end
make_it_root() click to toggle source
# File lib/mpt_tree.rb, line 10
def make_it_root
  create_mpt_tree_node #unless MptTree::Node.root_created? self.class.name
  self.reload
end
nodes_at_level(level) click to toggle source
# File lib/mpt_tree.rb, line 62
def nodes_at_level(level)
  nodes = Array.new
  tree.each do |node|
    nodes << node if node.level(self) == level
  end
  nodes
end
parent() click to toggle source
# File lib/mpt_tree.rb, line 25
def parent
  ancestors.last
end
root?() click to toggle source
# File lib/mpt_tree.rb, line 41
def root?
   (level(self.class.name.constantize.first) == 0) ? true : false
end
self_with_ancestors() click to toggle source
# File lib/mpt_tree.rb, line 54
def self_with_ancestors
  ancestors << self
end
siblings() click to toggle source
# File lib/mpt_tree.rb, line 29
def siblings
  parent.nodes_at_level(level(parent)) - [self]
end
tree() click to toggle source
# File lib/mpt_tree.rb, line 15
def tree
  node_ids = mpt_tree_node.tree
  self.class.name.constantize.where(:id => node_ids)
end