OSDN Git Service

element
[pettanr/pettanr.git] / lib / manifest / model.rb
1 require_dependency "manifest/model/attribute"
2 require_dependency "manifest/model/association"
3 require_dependency "manifest/model/list"
4 require_dependency "manifest/model/tree"
5
6 module Manifest
7   class Model
8     
9     def self.manager manifest, my_manifests
10       models = {}
11       my_manifests.each {|model_name, model_manifest|
12         models[model_name] = self.new(manifest, model_name, model_manifest)
13       }
14       models
15     end
16     
17     attr :model_name, :model_manifest, 
18       :attributes, :associations, :tree, :lists
19     def initialize manifest, model_name, model_manifest
20       @manifest = manifest
21       @model_name = model_name
22       @model_manifest = model_manifest
23       self.set_default
24       self.init
25     end
26     
27     def set_default
28       @model_manifest['attributes'] ||= {}
29       @model_manifest['associations'] ||= {}
30       @model_manifest['tree'] ||= {}
31       @model_manifest['lists'] ||= {}
32       @model_manifest['attributes']['id'] = {
33         'type' => 'number',
34         'primary_key' => 1,
35         'rules' => {
36           'number' => true
37         }
38       }
39       @model_manifest['attributes']['created_at'] = {
40         'type' => 'datetime',
41       }
42       @model_manifest['attributes']['updated_at'] = {
43         'type' => 'datetime',
44       }
45     end
46     
47     def init
48       @attributes = {}
49       @model_manifest['attributes'].each {|attribute_name, attribute_manifest|
50         @attributes[attribute_name] = ModelModule::Attribute.new(self, attribute_name, attribute_manifest)
51       }
52       @associations = ModelModule::Association.new(self, @model_manifest['associations'])
53       @tree = {}
54       @model_manifest['tree'].each {|tree_name, parent_model_name|
55         @tree[tree_name] = ModelModule::Tree.new(self, tree_name, parent_model_name)
56       }
57       @lists = {}
58       @model_manifest['lists'].each {|list_name, list_manifest|
59         @lists[list_name] = ModelModule::ListFactory.factory(self, list_name, list_manifest)
60       }
61     end
62     
63     def classify
64       ::Manifest.item_name_to_model @model_name
65     end
66     
67     def table_name
68       self.classify.table_name
69     end
70     
71     def valid_encode_columns
72       r = []
73       @attributes.each {|attribute_name, attribute|
74         next unless attribute.type == 'text'
75         r << attribute_name
76       }
77       r
78     end
79     
80     def owner_type
81       return :author if @attributes['author_id']
82       return :artist if @attributes['artist_id']
83       false
84     end
85     
86     def content_model
87       return true if self.owner_type
88       false
89     end
90     
91     def each_child_model_manifest tree_name
92       ::Manifest.models.each {|child_model_name, child_model_manifest|
93         next unless child_model_manifest.tree[tree_name]
94         next unless child_model_manifest.tree[tree_name].parent_model_name == @model_name
95         yield child_model_manifest
96       }
97     end
98     
99     def child_models tree_name
100       r = []
101       self.each_child_model_manifest(tree_name) {|child_model_manifest|
102         r << child_model_manifest.classify
103       }
104       r
105     end
106     
107     def child_element_names tree_name
108       r = []
109       self.each_child_model_manifest(tree_name) {|child_model_manifest|
110         # has_one ?
111         r << self.associations.child_element_name(child_model_manifest.model_name)
112       }
113       r
114     end
115     
116   end
117 end
118