OSDN Git Service

fix: op upload and destroy
[pettanr/pettanr.git] / lib / peta / binder.rb
1 module Peta
2   class Binder < Content
3     self.abstract_class = true
4     
5     # Dynamic Methods
6     
7     def self.load_manifest
8       super
9       # Class Methods
10       # Instance Methods
11       define_method("leaf_items") do |leaf_model|
12         self.__send__ self.class.my_manifest.associations.child_element_name(leaf_model)
13       end
14       define_method("leafs_items") do 
15         self.class.child_models.map {|child_model|
16           self.leaf_items child_model
17         }.flatten
18       end
19     end
20     
21     # Class Methods
22     
23     # Instance Methods
24     
25     def boosts level
26       super
27       self.leafs_items.each do |item|
28         item.boosts level
29       end
30     end
31     
32     def self.collect_element_value elements, name
33       elements.map {|e|
34         if e['_destroy'] or e[:_destroy]
35           nil
36         else
37           e[name]
38         end
39       }
40     end
41     
42     def self.validate_serial ary, offset = 0
43       i = offset
44       ary.compact.sort.each do |n|
45         break false unless n == i
46         i += 1
47       end
48       ary.compact.size == i - offset
49     end
50     
51     def self.validate_element_serial elements, name, offset = 0
52       self.validate_serial(self.collect_element_value(elements, name), offset)
53     end
54     
55     def self.validate_elements_serial c
56       c.map {|conf|
57         self.validate_element_serial(conf[:elements], conf[:name], conf[:offset]) ? nil : false
58       }.compact.empty?
59     end
60     
61     def validate_serial_list
62       [
63         {:elements => self.leafs_items, :name => :t, :offset => 0}, 
64         {:elements => self.leafs_items, :name => :z, :offset => 1}
65       ]
66     end
67     
68     def validate_child
69   #    r1 = Panel.validate_elements_id validate_id_list
70       self.class.validate_elements_serial validate_serial_list
71     end
72     
73     def destroy
74       res = false
75       self.class.transaction do
76         self.leafs_items.each do |leaf|
77           raise ActiveRecord::Rollback unless leaf.destroy
78         end
79         res = super
80         raise ActiveRecord::Rollback unless res
81       end
82       res
83     end
84     
85   end
86 end
87