OSDN Git Service

fix form helper
[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, :extend_column_name
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['extend_column_name'] ||= 'classname'
33       @model_manifest['attributes']['id'] = {
34         'type' => 'number',
35         'primary_key' => 1,
36         'rules' => {
37           'number' => true
38         }
39       }
40       @model_manifest['attributes']['created_at'] = {
41         'type' => 'datetime',
42       }
43       @model_manifest['attributes']['updated_at'] = {
44         'type' => 'datetime',
45       }
46     end
47     
48     def init
49       @attributes = {}
50       @model_manifest['attributes'].each {|attribute_name, attribute_manifest|
51         @attributes[attribute_name] = ModelModule::Attribute.new(self, attribute_name, attribute_manifest)
52       }
53       @associations = ModelModule::Association.new(self, @model_manifest['associations'])
54       @tree = {}
55       @model_manifest['tree'].each {|tree_name, parent_model_name|
56         @tree[tree_name] = ModelModule::Tree.new(self, tree_name, parent_model_name)
57       }
58       @extend_column_name = @model_manifest['extend_column_name']
59       @lists = {}
60       @model_manifest['lists'].each {|list_name, list_manifest|
61         @lists[list_name] = ModelModule::ListFactory.factory(self, list_name, list_manifest)
62       }
63     end
64     
65     def classify
66       ::Manifest.item_name_to_model @model_name
67     end
68     
69     def table_name
70       self.classify.table_name
71     end
72     
73     def valid_encode_columns
74       r = []
75       @attributes.each {|attribute_name, attribute|
76         next unless attribute.type == 'text'
77         r << attribute_name
78       }
79       r
80     end
81     
82     def owner_type
83       return :author if @attributes['author_id']
84       return :artist if @attributes['artist_id']
85       false
86     end
87     
88     def content_model
89       return true if self.owner_type
90       false
91     end
92     
93     def each_child_model_manifest tree_name
94       ::Manifest.manifest.models.each {|child_model_name, child_model_manifest|
95         next unless child_model_manifest.tree[tree_name]
96         next unless child_model_manifest.tree[tree_name].parent_model_name == @model_name
97         yield child_model_manifest
98       }
99     end
100     
101     def child_models tree_name
102       r = []
103       self.each_child_model_manifest(tree_name) {|child_model_manifest|
104         r << child_model_manifest.classify
105       }
106       r
107     end
108     
109     def child_element_names tree_name
110       r = []
111       self.each_child_model_manifest(tree_name) {|child_model_manifest|
112         # has_one ?
113         r << self.associations.child_element_name(child_model_manifest)
114       }
115       r
116     end
117     
118   end
119 end
120