OSDN Git Service

mrg
[pettanr/pettanr.git] / lib / peta / binder.rb
index 9d0aa6c..efedd65 100644 (file)
@@ -4,23 +4,15 @@ module Peta
     
     # Dynamic Methods
     
-    def self._leaf_tree_name
-      self.my_manifest.peta.leaf_tree_name
-    end
-    
     def self.load_manifest
       super
       # Class Methods
-      n = self._leaf_tree_name
-      define_singleton_method("leaf_tree_name") do 
-        n
-      end
       # Instance Methods
       define_method("leaf_items") do |leaf_model|
         self.__send__ self.class.my_manifest.associations.child_element_name(leaf_model)
       end
       define_method("leafs_items") do 
-        self.class.child_models(self.class.leaf_tree_name).map {|child_model|
+        self.class.child_models.map {|child_model|
           self.leaf_items child_model
         }.flatten
       end
@@ -28,6 +20,68 @@ module Peta
     
     # Class Methods
     
+    # Instance Methods
+    
+    def boosts level
+      super
+      self.leafs_items.each do |item|
+        item.boosts level
+      end
+    end
+    
+    def self.collect_element_value elements, name
+      elements.map {|e|
+        if e['_destroy'] or e[:_destroy]
+          nil
+        else
+          e[name]
+        end
+      }
+    end
+    
+    def self.validate_serial ary, offset = 0
+      i = offset
+      ary.compact.sort.each do |n|
+        break false unless n == i
+        i += 1
+      end
+      ary.compact.size == i - offset
+    end
+    
+    def self.validate_element_serial elements, name, offset = 0
+      self.validate_serial(self.collect_element_value(elements, name), offset)
+    end
+    
+    def self.validate_elements_serial c
+      c.map {|conf|
+        self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
+      }.compact.empty?
+    end
+    
+    def validate_serial_list
+      [
+        {:elements => self.leafs_items, :name => :t, :offset => 0}, 
+        {:elements => self.leafs_items, :name => :z, :offset => 1}
+      ]
+    end
+    
+    def validate_child
+  #    r1 = Panel.validate_elements_id validate_id_list
+      self.class.validate_elements_serial validate_serial_list
+    end
+    
+    def destroy
+      res = false
+      self.class.transaction do
+        self.leafs_items.each do |leaf|
+          raise ActiveRecord::Rollback unless leaf.destroy_and_shorten
+        end
+        res = super
+        raise ActiveRecord::Rollback unless res
+      end
+      res
+    end
+    
   end
 end