lib/mongoid_tree.rb in mongoid_tree-0.1.0 vs lib/mongoid_tree.rb in mongoid_tree-0.2.0
- old
+ new
@@ -1,37 +1,55 @@
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
+ references_many :children, :class_name => self.name, :stored_as => :array, :inverse_of => :parents do
def <<(*objects)
objects.flatten.each_with_index do |object, index|
+ reverse_key = reverse_key(object)
if object.position == nil
+ # This one sets the position for a new object added via children << object
object.position = @parent.send(@foreign_key).count + index + 1
end
+ # Stores the parents path into it's own path array.
+ #raise @parent.inspect
+ object.send(reverse_key).concat(@parent.send(reverse_key))
end
super(objects)
+
end
end
- referenced_in :parent, :class_name => self.name, :inverse_of => :children
+ #referenced_in :parent, :class_name => self.name, :inverse_of => :children
+ references_many :parents, :class_name => self.name, :stored_as => :array, :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
+ field :depth, :type => Integer
end
module InstanceMethods
+ def parent
+ self.parents.last
+ end
+
+ def depth
+ self.parents.count
+ end
+
#Comparable
def <=> (another_node)
self.position <=> another_node.position
end
-
+
+
+ # TODO change this into a Mongoid Query
def depth_first
result = [self]
if children.empty?
return result
else
@@ -40,30 +58,27 @@
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
+ self.parent.reload.children << new_child
end
def insert_after ( new_child )
- self.save
- self.parent.save
- new_child.position = self.position
+ new_child.position = self.position + 1
self.parent.children.each do |child|
if child.position >= new_child.position
child.position += 1
end
end
- self.parent.children << new_child
+ self.parent.children << new_child
end
end
\ No newline at end of file