Module: ActsAsManyTrees::InstanceMethods

Extended by:
ActiveSupport::Concern
Defined in:
lib/acts_as_many_trees/base.rb

Instance Method Summary collapse

Instance Method Details

#add_child(new_child, tree_name = self.default_tree_name) ⇒ Object



108
109
110
# File 'lib/acts_as_many_trees/base.rb', line 108

def add_child(new_child,tree_name=self.default_tree_name)
  hierarchy_class.set_parent_of(item:new_child,new_parent:self,hierarchy_scope:tree_name)
end

#ancestors(tree_name = self.default_tree_name) ⇒ Object



124
125
126
# File 'lib/acts_as_many_trees/base.rb', line 124

def ancestors(tree_name=self.default_tree_name)
  self_and_ancestors(tree_name).not_this(self.id)
end

#children(tree_name = self.default_tree_name) ⇒ Object



116
117
118
# File 'lib/acts_as_many_trees/base.rb', line 116

def children(tree_name=self.default_tree_name)
  descendants(tree_name).where('generation=1')
end

#default_tree_nameObject

can be over-ridden in the instance



83
84
85
# File 'lib/acts_as_many_trees/base.rb', line 83

def default_tree_name
  ''
end

#descendants(tree_name = self.default_tree_name) ⇒ Object



144
145
146
# File 'lib/acts_as_many_trees/base.rb', line 144

def descendants(tree_name=self.default_tree_name)
  self_and_descendants(tree_name).not_this(self.id)
end

#next_siblingObject



140
141
142
# File 'lib/acts_as_many_trees/base.rb', line 140

def next_sibling
  siblings_after.first
end

#parent(tree_name = self.default_tree_name) ⇒ Object



112
113
114
# File 'lib/acts_as_many_trees/base.rb', line 112

def parent(tree_name=self.default_tree_name)
  ancestors(tree_name).where('generation=1').first
end

#parent=(inpt_parent) ⇒ Object



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/acts_as_many_trees/base.rb', line 87

def parent=(inpt_parent)
  if inpt_parent.is_a?(Hash)
    new_parent=inpt_parent[:new_parent]
    after_node=inpt_parent[:after_node] 
    before_node=inpt_parent[:before_node] 
    tree_name = inpt_parent[:tree_name] || (new_parent ? new_parent.default_tree_name : self.default_tree_name)
    existing_tree_name = inpt_parent[:existing_tree_name] || self.default_tree_name
  else
    new_parent=inpt_parent
    after_node=inpt_parent.children.ordered.last unless inpt_parent.nil?
    before_node=inpt_parent.next_sibling unless inpt_parent.nil?
    tree_name = inpt_parent ? inpt_parent.default_tree_name : self.default_tree_name
    existing_tree_name = self.default_tree_name
  end  
  hierarchy_class.set_parent_of(item:self,new_parent:new_parent,hierarchy_scope:tree_name,existing_scope:existing_tree_name,after_node:after_node,before_node:before_node)
end

#position(tree_name = self.default_tree_name) ⇒ Object



148
149
150
151
# File 'lib/acts_as_many_trees/base.rb', line 148

def position(tree_name=self.default_tree_name)
   link = unscoped_ancestor_links.where(ancestor_id: id,hierarchy_scope: tree_name).first
   link ? link.position: 0
end

#previous_siblingObject



136
137
138
# File 'lib/acts_as_many_trees/base.rb', line 136

def previous_sibling
  siblings_before.last
end

#self_and_ancestors(tree_name = self.default_tree_name) ⇒ Object



120
121
122
# File 'lib/acts_as_many_trees/base.rb', line 120

def self_and_ancestors(tree_name=self.default_tree_name)
  unscoped_ancestors.merge(hierarchy_class.scope_hierarchy(tree_name))
end

#self_and_descendants(tree_name = self.default_tree_name) ⇒ Object



128
129
130
# File 'lib/acts_as_many_trees/base.rb', line 128

def self_and_descendants(tree_name=self.default_tree_name)
  unscoped_descendants.merge(hierarchy_class.scope_hierarchy(tree_name))
end

#set_parent(new_parent:, tree_name: self.default_tree_name, existing_tree: self.default_tree_name, clone_sub_tree: false) ⇒ Object



104
105
106
# File 'lib/acts_as_many_trees/base.rb', line 104

def set_parent(new_parent:,tree_name:self.default_tree_name,existing_tree:self.default_tree_name,clone_sub_tree:false)
  hierarchy_class.set_parent_of(item:self,new_parent:new_parent,hierarchy_scope:tree_name,existing_scope:existing_tree,clone_sub_tree:clone_sub_tree)
end

#siblingsObject



132
133
134
# File 'lib/acts_as_many_trees/base.rb', line 132

def siblings
  self_and_siblings.where.not(id: id)
end