Module: ActsAsDAG::InstanceMethods
- Defined in:
- lib/acts_as_dag/acts_as_dag.rb
Instance Method Summary collapse
-
#add_child(*children) ⇒ Object
Adds a category as a child of this category (self).
-
#add_parent(*parents) ⇒ Object
Adds a category as a parent of this category (self).
-
#ancestor_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s descendants include self.
-
#child_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s children include self.
-
#children=(children) ⇒ Object
NOTE: Children that are removed will not trigger the destroy callback on their link, so we need to remove them manually.
-
#descendant_class ⇒ Object
Returns the class used for descendants.
-
#descendant_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s descendants include self.
- #leaf? ⇒ Boolean
-
#lineage ⇒ Object
Returns an array of ancestors and descendants.
-
#link_class ⇒ Object
Returns the class used for links.
- #make_root ⇒ Object
-
#parent_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s parents include self.
-
#parents=(parents) ⇒ Object
NOTE: Parents that are removed will not trigger the destroy callback on their link, so we need to remove them manually.
-
#remove_child(child) ⇒ Object
Removes a category as a child of this category (self) Returns the child.
-
#remove_parent(parent) ⇒ Object
Removes a category as a parent of this category (self) Returns the parent.
-
#root? ⇒ Boolean
Returns true if this record is a root node.
Instance Method Details
#add_child(*children) ⇒ Object
Adds a category as a child of this category (self)
165 166 167 168 169 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 165 def add_child(*children) children.flatten.each do |child| ActsAsDAG::HelperMethods.link(self, child) end end |
#add_parent(*parents) ⇒ Object
Adds a category as a parent of this category (self)
158 159 160 161 162 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 158 def add_parent(*parents) parents.flatten.each do |parent| ActsAsDAG::HelperMethods.link(parent, self) end end |
#ancestor_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s descendants include self
201 202 203 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 201 def ancestor_of?(category, = {}) category.ancestors.exists?(id) end |
#child_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s children include self
186 187 188 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 186 def child_of?(category, = {}) category.children.exists?(id) end |
#children=(children) ⇒ Object
NOTE: Children that are removed will not trigger the destroy callback on their link, so we need to remove them manually
149 150 151 152 153 154 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 149 def children=(children) (self.children - children).each do |child_to_remove| remove_child(child_to_remove) end super end |
#descendant_class ⇒ Object
Returns the class used for descendants
211 212 213 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 211 def descendant_class self.class.descendant_class end |
#descendant_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s descendants include self
196 197 198 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 196 def descendant_of?(category, = {}) category.descendants.exists?(id) end |
#leaf? ⇒ Boolean
130 131 132 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 130 def leaf? children.empty? end |
#lineage ⇒ Object
Returns an array of ancestors and descendants
216 217 218 219 220 221 222 223 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 216 def lineage lineage_links = self.class.descendant_table_entries .select("(CASE ancestor_id WHEN #{id} THEN descendant_id ELSE ancestor_id END) AS id, ancestor_id, descendant_id, distance") .where('ancestor_id = :id OR descendant_id = :id', :id => id) .where('ancestor_id != descendant_id') # Don't include self self.class.joins("JOIN (#{lineage_links.to_sql}) lineage_links ON #{self.class.table_name}.id = lineage_links.id").order("CASE ancestor_id WHEN #{id} THEN distance ELSE -distance END") # Ensure the links are orders furthest ancestor to furthest descendant end |
#link_class ⇒ Object
Returns the class used for links
206 207 208 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 206 def link_class self.class.link_class end |
#make_root ⇒ Object
134 135 136 137 138 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 134 def make_root ancestor_links.delete_all parent_links.delete_all initialize_dag end |
#parent_of?(category, options = {}) ⇒ Boolean
Returns true if the category’s parents include self
191 192 193 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 191 def parent_of?(category, = {}) category.parents.exists?(id) end |
#parents=(parents) ⇒ Object
NOTE: Parents that are removed will not trigger the destroy callback on their link, so we need to remove them manually
141 142 143 144 145 146 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 141 def parents=(parents) (self.parents - parents).each do |parent_to_remove| remove_parent(parent_to_remove) end super end |
#remove_child(child) ⇒ Object
Removes a category as a child of this category (self) Returns the child
173 174 175 176 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 173 def remove_child(child) ActsAsDAG::HelperMethods.unlink(self, child) return child end |
#remove_parent(parent) ⇒ Object
Removes a category as a parent of this category (self) Returns the parent
180 181 182 183 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 180 def remove_parent(parent) ActsAsDAG::HelperMethods.unlink(parent, self) return parent end |
#root? ⇒ Boolean
Returns true if this record is a root node
126 127 128 |
# File 'lib/acts_as_dag/acts_as_dag.rb', line 126 def root? parents.empty? end |