lib/customize/inherited.rb in customize-0.0.3 vs lib/customize/inherited.rb in customize-0.0.4

- old
+ new

@@ -1,29 +1,56 @@ module Customize module Inherited def self.included base base.extend ClassMethods + base.has_one :inherit_node, :class_name=>Customize::InheritNode.name, :as=>:node, :dependent=>:destroy base.after_create { |object| object.create_inherit_node :left=>0, :right=>1 } + base.delegate :leaf?, :to=>:inherit_node + base.before_destroy { |object| raise 'object should not have children when destroy' if object.inherit_node.children.size > 0 } end module ClassMethods def root joins(:inherit_node).where("parent_id is null") end + + def type_tree + roots = root + converter = proc {|items| + out = items.collect { |item| + {:id=>item.id,:label=>item.label,:inherit_node_id=>item.inherit_node.id, :children=>converter.call(item.children)} + } + } + + converter.call(roots) + end end + def parent + inherit_node.parent_node.try(:node) + end + + def children + inherit_node.children.collect(&:node) + end + + def label + self.to_s + end + def inherit parent raise 'should be save first' if self.new_record? raise 'should be same class' if self.class != parent.class + raise 'should not be self' if self.id == parent.id inherit_node.parent_id = parent.inherit_node.id right = parent.inherit_node.right InheritNode.where("right >= ?", inherit_node.left).update_all("right = right+2") inherit_node.left = right inherit_node.right = right + 1