lib/mongoid_tree.rb in mongoid_tree-0.0.0 vs lib/mongoid_tree.rb in mongoid_tree-0.1.0

- old
+ new

@@ -1,72 +1,145 @@ +module Mongoid + module Acts + module Tree + extend ActiveSupport::Concern + include Comparable + + included do + references_many :children, :class_name => self.name, :stored_as => :array, :inverse_of => :parent do + def <<(*objects) + objects.flatten.each_with_index do |object, index| + if object.position == nil + object.position = @parent.send(@foreign_key).count + index + 1 + end + end + super(objects) + end + end + + referenced_in :parent, :class_name => self.name, :inverse_of => :children + + # This stores the position in the children array of the parent object. + # Makes it easier to flatten / export / import a tree + field :position, :type => Integer + end + + module InstanceMethods + + #Comparable + def <=> (another_node) + self.position <=> another_node.position + end + + def depth_first + result = [self] + if children.empty? + return result + else + self.children.each do |child| + result += child.depth_first + end + end + return result + end + + + def insert_before( new_child ) + new_child.position = self.position + self.parent.children.each do |child| + if child.position >= new_child.position + child.position += 1 + end + end + self.parent.children << new_child + end + + def insert_after ( new_child ) + self.save + self.parent.save + new_child.position = self.position + self.parent.children.each do |child| + if child.position >= new_child.position + child.position += 1 + end + end + self.parent.children << new_child + end + end + + + + end + end +end \ No newline at end of file