OSDN Git Service

6b860714ba2736aeec99361f2941478576e41947
[pettanr/pettanr.git] / lib / manifest / model.rb
1 ManifestBase.require_modules "manifest/model/", 
2   %w|attribute association list tree peta|
3
4 module Manifest
5   class Model < ManifestBase::Base
6     include ModelModule
7     
8     attr :attributes, :associations, :tree, :list, :peta, :extend_column_name
9     
10     def set_default
11       super
12       @json['attributes'] ||= {}
13       @json['associations'] ||= {}
14       @json['tree'] ||= {}
15       @json['list'] ||= {}
16       @json['extend_column_name'] ||= 'classname'
17       @json['peta'] ||= {}
18       @json['attributes']['id'] = {
19         'type' => 'number',
20         'primary_key' => 1,
21         'rules' => {
22           'number' => true
23         }
24       }
25       @json['attributes']['created_at'] = {
26         'type' => 'datetime',
27       }
28       @json['attributes']['updated_at'] = {
29         'type' => 'datetime',
30       }
31     end
32     
33     def init
34       super
35       @attributes = ManifestBase.load_name_values self, @json, 'attributes', Attribute
36       @associations = ManifestBase.load_value self, @json, 'associations', Association
37       @tree = {}
38       @json['tree'].each {|tree_name, parent_model_name|
39         @tree[tree_name] = Tree.new(self, tree_name, parent_model_name)
40       }
41       @peta = ManifestBase.load_type_args(self, @json, 'peta', PetaFactory)
42       @extend_column_name = @json['extend_column_name']
43       @list = ManifestBase.load_value self, @json, 'list', List
44     end
45     
46     def model_name
47       @name
48     end
49     
50     def classify
51       ::Manifest.item_name_to_model @name
52     end
53     
54     def table_name
55       self.classify.table_name
56     end
57     
58     def valid_encode_columns
59       r = []
60       @attributes.each {|attribute_name, attribute|
61         next unless attribute.type == 'text'
62         r << attribute_name
63       }
64       r
65     end
66     
67     def owner_type
68       return :author if @attributes['author_id']
69       return :artist if @attributes['artist_id']
70       false
71     end
72     
73     def content_model
74       return true if self.owner_type
75       false
76     end
77     
78     def child_model_manifests tree_name
79       r = []
80       ::Manifest.manifest.models.each {|child_model_name, child_model_manifest|
81         next unless child_model_manifest.tree[tree_name]
82         next unless child_model_manifest.tree[tree_name].parent_model_name == @model_name
83         r << child_model_manifest
84       }
85       r
86     end
87     
88     def child_models tree_name
89       self.child_model_manifests(tree_name).map {|child_model_manifest|
90         child_model_manifest.classify
91       }
92     end
93     
94     def child_element_names tree_name
95       self.child_models(tree_name).map {|child_model|
96         self.associations.child_element_name(child_model)
97       }
98     end
99     
100     def child_element_name item_name
101       self.associations.child_element_name(child_model_manifest)
102     end
103     
104   end
105 end
106