mongo_mapper_ign 0.7.7 → 0.7.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. data/LICENSE +20 -20
  2. data/README.rdoc +34 -34
  3. data/bin/mmconsole +60 -60
  4. data/lib/mongo_mapper.rb +123 -123
  5. data/lib/mongo_mapper/document.rb +292 -292
  6. data/lib/mongo_mapper/embedded_document.rb +71 -71
  7. data/lib/mongo_mapper/plugins.rb +36 -36
  8. data/lib/mongo_mapper/plugins/associations.rb +115 -115
  9. data/lib/mongo_mapper/plugins/associations/base.rb +124 -124
  10. data/lib/mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy.rb +31 -31
  11. data/lib/mongo_mapper/plugins/associations/belongs_to_proxy.rb +26 -26
  12. data/lib/mongo_mapper/plugins/associations/collection.rb +21 -21
  13. data/lib/mongo_mapper/plugins/associations/embedded_collection.rb +39 -39
  14. data/lib/mongo_mapper/plugins/associations/in_array_proxy.rb +160 -144
  15. data/lib/mongo_mapper/plugins/associations/many_documents_as_proxy.rb +29 -29
  16. data/lib/mongo_mapper/plugins/associations/many_documents_proxy.rb +130 -130
  17. data/lib/mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy.rb +32 -32
  18. data/lib/mongo_mapper/plugins/associations/many_embedded_proxy.rb +24 -24
  19. data/lib/mongo_mapper/plugins/associations/many_polymorphic_proxy.rb +14 -14
  20. data/lib/mongo_mapper/plugins/associations/one_embedded_proxy.rb +42 -42
  21. data/lib/mongo_mapper/plugins/associations/one_proxy.rb +70 -70
  22. data/lib/mongo_mapper/plugins/associations/proxy.rb +125 -125
  23. data/lib/mongo_mapper/plugins/callbacks.rb +241 -241
  24. data/lib/mongo_mapper/plugins/clone.rb +13 -13
  25. data/lib/mongo_mapper/plugins/descendants.rb +16 -16
  26. data/lib/mongo_mapper/plugins/dirty.rb +119 -119
  27. data/lib/mongo_mapper/plugins/equality.rb +23 -23
  28. data/lib/mongo_mapper/plugins/identity_map.rb +123 -123
  29. data/lib/mongo_mapper/plugins/inspect.rb +14 -14
  30. data/lib/mongo_mapper/plugins/keys.rb +322 -322
  31. data/lib/mongo_mapper/plugins/keys/key.rb +53 -53
  32. data/lib/mongo_mapper/plugins/logger.rb +17 -17
  33. data/lib/mongo_mapper/plugins/modifiers.rb +111 -111
  34. data/lib/mongo_mapper/plugins/pagination.rb +24 -24
  35. data/lib/mongo_mapper/plugins/pagination/proxy.rb +72 -72
  36. data/lib/mongo_mapper/plugins/persistence.rb +96 -96
  37. data/lib/mongo_mapper/plugins/protected.rb +46 -46
  38. data/lib/mongo_mapper/plugins/rails.rb +57 -57
  39. data/lib/mongo_mapper/plugins/serialization.rb +92 -92
  40. data/lib/mongo_mapper/plugins/serialization/array.rb +56 -56
  41. data/lib/mongo_mapper/plugins/serialization/xml_serializer.rb +239 -239
  42. data/lib/mongo_mapper/plugins/timestamps.rb +21 -21
  43. data/lib/mongo_mapper/plugins/userstamps.rb +14 -14
  44. data/lib/mongo_mapper/plugins/validations.rb +46 -46
  45. data/lib/mongo_mapper/query.rb +28 -28
  46. data/lib/mongo_mapper/support.rb +197 -197
  47. data/lib/mongo_mapper/support/descendant_appends.rb +46 -46
  48. data/lib/mongo_mapper/support/find.rb +77 -77
  49. data/lib/mongo_mapper/version.rb +3 -3
  50. metadata +4 -25
@@ -1,71 +1,71 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module EmbeddedDocument
4
- extend Support::DescendantAppends
5
-
6
- def self.included(model)
7
- model.class_eval do
8
- include InstanceMethods
9
- extend ClassMethods
10
- extend Plugins
11
-
12
- plugin Plugins::Associations
13
- plugin Plugins::Clone
14
- plugin Plugins::Descendants
15
- plugin Plugins::Equality
16
- plugin Plugins::Inspect
17
- plugin Plugins::Keys
18
- plugin Plugins::Logger
19
- plugin Plugins::Persistence
20
- plugin Plugins::Protected
21
- plugin Plugins::Rails
22
- plugin Plugins::Serialization
23
- plugin Plugins::Validations
24
- plugin Plugins::Callbacks
25
-
26
- attr_reader :_root_document, :_parent_document
27
- end
28
-
29
- super
30
- end
31
-
32
- module ClassMethods
33
- def embeddable?
34
- true
35
- end
36
-
37
- def embedded_in(owner_name)
38
- define_method(owner_name) { _parent_document }
39
- end
40
- end
41
-
42
- module InstanceMethods
43
- def destroyed?
44
- !!_root_document.try(:destroyed?)
45
- end
46
-
47
- def new?
48
- _root_document.try(:new?) || @new
49
- end
50
-
51
- def save(options={})
52
- if result = _root_document.try(:save, options)
53
- @new = false
54
- end
55
- result
56
- end
57
-
58
- def save!(options={})
59
- if result = _root_document.try(:save!, options)
60
- @new = false
61
- end
62
- result
63
- end
64
-
65
- def _parent_document=(value)
66
- @_root_document = value._root_document
67
- @_parent_document = value
68
- end
69
- end # InstanceMethods
70
- end # EmbeddedDocument
71
- end # MongoMapper
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module EmbeddedDocument
4
+ extend Support::DescendantAppends
5
+
6
+ def self.included(model)
7
+ model.class_eval do
8
+ include InstanceMethods
9
+ extend ClassMethods
10
+ extend Plugins
11
+
12
+ plugin Plugins::Associations
13
+ plugin Plugins::Clone
14
+ plugin Plugins::Descendants
15
+ plugin Plugins::Equality
16
+ plugin Plugins::Inspect
17
+ plugin Plugins::Keys
18
+ plugin Plugins::Logger
19
+ plugin Plugins::Persistence
20
+ plugin Plugins::Protected
21
+ plugin Plugins::Rails
22
+ plugin Plugins::Serialization
23
+ plugin Plugins::Validations
24
+ plugin Plugins::Callbacks
25
+
26
+ attr_reader :_root_document, :_parent_document
27
+ end
28
+
29
+ super
30
+ end
31
+
32
+ module ClassMethods
33
+ def embeddable?
34
+ true
35
+ end
36
+
37
+ def embedded_in(owner_name)
38
+ define_method(owner_name) { _parent_document }
39
+ end
40
+ end
41
+
42
+ module InstanceMethods
43
+ def destroyed?
44
+ !!_root_document.try(:destroyed?)
45
+ end
46
+
47
+ def new?
48
+ _root_document.try(:new?) || @new
49
+ end
50
+
51
+ def save(options={})
52
+ if result = _root_document.try(:save, options)
53
+ @new = false
54
+ end
55
+ result
56
+ end
57
+
58
+ def save!(options={})
59
+ if result = _root_document.try(:save!, options)
60
+ @new = false
61
+ end
62
+ result
63
+ end
64
+
65
+ def _parent_document=(value)
66
+ @_root_document = value._root_document
67
+ @_parent_document = value
68
+ end
69
+ end # InstanceMethods
70
+ end # EmbeddedDocument
71
+ end # MongoMapper
@@ -1,36 +1,36 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- def plugins
5
- @plugins ||= []
6
- end
7
-
8
- def plugin(mod)
9
- extend mod::ClassMethods if mod.const_defined?(:ClassMethods)
10
- include mod::InstanceMethods if mod.const_defined?(:InstanceMethods)
11
- mod.configure(self) if mod.respond_to?(:configure)
12
- plugins << mod
13
- end
14
-
15
- autoload :Callbacks, 'mongo_mapper/plugins/callbacks'
16
- autoload :Clone, 'mongo_mapper/plugins/clone'
17
- autoload :Descendants, 'mongo_mapper/plugins/descendants'
18
- autoload :Dirty, 'mongo_mapper/plugins/dirty'
19
- autoload :Equality, 'mongo_mapper/plugins/equality'
20
- autoload :IdentityMap, 'mongo_mapper/plugins/identity_map'
21
- autoload :Inspect, 'mongo_mapper/plugins/inspect'
22
- autoload :Keys, 'mongo_mapper/plugins/keys'
23
- autoload :Logger, 'mongo_mapper/plugins/logger'
24
- autoload :Modifiers, 'mongo_mapper/plugins/modifiers'
25
- autoload :Persistence, 'mongo_mapper/plugins/persistence'
26
- autoload :Protected, 'mongo_mapper/plugins/protected'
27
- autoload :Rails, 'mongo_mapper/plugins/rails'
28
- autoload :Serialization, 'mongo_mapper/plugins/serialization'
29
- autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
30
- autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
31
- autoload :Validations, 'mongo_mapper/plugins/validations'
32
- end
33
- end
34
-
35
- require 'mongo_mapper/plugins/associations'
36
- require 'mongo_mapper/plugins/pagination'
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ def plugins
5
+ @plugins ||= []
6
+ end
7
+
8
+ def plugin(mod)
9
+ extend mod::ClassMethods if mod.const_defined?(:ClassMethods)
10
+ include mod::InstanceMethods if mod.const_defined?(:InstanceMethods)
11
+ mod.configure(self) if mod.respond_to?(:configure)
12
+ plugins << mod
13
+ end
14
+
15
+ autoload :Callbacks, 'mongo_mapper/plugins/callbacks'
16
+ autoload :Clone, 'mongo_mapper/plugins/clone'
17
+ autoload :Descendants, 'mongo_mapper/plugins/descendants'
18
+ autoload :Dirty, 'mongo_mapper/plugins/dirty'
19
+ autoload :Equality, 'mongo_mapper/plugins/equality'
20
+ autoload :IdentityMap, 'mongo_mapper/plugins/identity_map'
21
+ autoload :Inspect, 'mongo_mapper/plugins/inspect'
22
+ autoload :Keys, 'mongo_mapper/plugins/keys'
23
+ autoload :Logger, 'mongo_mapper/plugins/logger'
24
+ autoload :Modifiers, 'mongo_mapper/plugins/modifiers'
25
+ autoload :Persistence, 'mongo_mapper/plugins/persistence'
26
+ autoload :Protected, 'mongo_mapper/plugins/protected'
27
+ autoload :Rails, 'mongo_mapper/plugins/rails'
28
+ autoload :Serialization, 'mongo_mapper/plugins/serialization'
29
+ autoload :Timestamps, 'mongo_mapper/plugins/timestamps'
30
+ autoload :Userstamps, 'mongo_mapper/plugins/userstamps'
31
+ autoload :Validations, 'mongo_mapper/plugins/validations'
32
+ end
33
+ end
34
+
35
+ require 'mongo_mapper/plugins/associations'
36
+ require 'mongo_mapper/plugins/pagination'
@@ -1,115 +1,115 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Associations
5
- module ClassMethods
6
- def belongs_to(association_id, options={}, &extension)
7
- create_association(:belongs_to, association_id, options, &extension)
8
- end
9
-
10
- def many(association_id, options={}, &extension)
11
- create_association(:many, association_id, options, &extension)
12
- end
13
-
14
- def one(association_id, options={}, &extension)
15
- create_association(:one, association_id, options, &extension)
16
- end
17
-
18
- def associations
19
- @associations ||= HashWithIndifferentAccess.new
20
- end
21
-
22
- def associations=(hash)
23
- @associations = hash
24
- end
25
-
26
- def inherited(subclass)
27
- subclass.associations = associations.dup
28
- super
29
- end
30
-
31
- private
32
- def create_association(type, name, options, &extension)
33
- association = Associations::Base.new(type, name, options, &extension)
34
- associations[association.name] = association
35
-
36
- define_method(association.name) do
37
- get_proxy(association)
38
- end
39
-
40
- define_method("#{association.name}=") do |value|
41
- get_proxy(association).replace(value)
42
- value
43
- end
44
-
45
- if association.one? || association.belongs_to?
46
- define_method("#{association.name}?") do
47
- get_proxy(association).present?
48
- end
49
- end
50
-
51
- if association.options[:dependent] && association.many? && !association.embeddable?
52
- after_destroy do |doc|
53
- case association.options[:dependent]
54
- when :destroy
55
- doc.get_proxy(association).destroy_all
56
- when :delete_all
57
- doc.get_proxy(association).delete_all
58
- when :nullify
59
- doc.get_proxy(association).nullify
60
- end
61
- end
62
- end
63
- end
64
- end
65
-
66
- module InstanceMethods
67
- def associations
68
- self.class.associations
69
- end
70
-
71
- # @api private?
72
- def embedded_associations
73
- associations.select do |name, association|
74
- association.embeddable?
75
- end.map do |name, association|
76
- association
77
- end
78
- end
79
-
80
- def get_proxy(association)
81
- unless proxy = self.instance_variable_get(association.ivar)
82
- proxy = association.proxy_class.new(self, association)
83
- self.instance_variable_set(association.ivar, proxy)
84
- end
85
-
86
- proxy
87
- end
88
-
89
- def save_to_collection(options = {})
90
- super
91
- associations.each do |association_name, association|
92
- proxy = get_proxy(association)
93
- proxy.save_to_collection(options) if proxy.proxy_respond_to?(:save_to_collection)
94
- end
95
- end
96
- end
97
-
98
- autoload :Base, 'mongo_mapper/plugins/associations/base'
99
- autoload :Collection, 'mongo_mapper/plugins/associations/collection'
100
- autoload :EmbeddedCollection, 'mongo_mapper/plugins/associations/embedded_collection'
101
- autoload :ManyDocumentsProxy, 'mongo_mapper/plugins/associations/many_documents_proxy'
102
- autoload :BelongsToProxy, 'mongo_mapper/plugins/associations/belongs_to_proxy'
103
- autoload :BelongsToPolymorphicProxy, 'mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy'
104
- autoload :ManyPolymorphicProxy, 'mongo_mapper/plugins/associations/many_polymorphic_proxy'
105
- autoload :ManyEmbeddedProxy, 'mongo_mapper/plugins/associations/many_embedded_proxy'
106
- autoload :ManyEmbeddedPolymorphicProxy, 'mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy'
107
- autoload :ManyDocumentsAsProxy, 'mongo_mapper/plugins/associations/many_documents_as_proxy'
108
- autoload :OneProxy, 'mongo_mapper/plugins/associations/one_proxy'
109
- autoload :OneEmbeddedProxy, 'mongo_mapper/plugins/associations/one_embedded_proxy'
110
- autoload :InArrayProxy, 'mongo_mapper/plugins/associations/in_array_proxy'
111
- end
112
- end
113
- end
114
-
115
- require 'mongo_mapper/plugins/associations/proxy'
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Associations
5
+ module ClassMethods
6
+ def belongs_to(association_id, options={}, &extension)
7
+ create_association(:belongs_to, association_id, options, &extension)
8
+ end
9
+
10
+ def many(association_id, options={}, &extension)
11
+ create_association(:many, association_id, options, &extension)
12
+ end
13
+
14
+ def one(association_id, options={}, &extension)
15
+ create_association(:one, association_id, options, &extension)
16
+ end
17
+
18
+ def associations
19
+ @associations ||= HashWithIndifferentAccess.new
20
+ end
21
+
22
+ def associations=(hash)
23
+ @associations = hash
24
+ end
25
+
26
+ def inherited(subclass)
27
+ subclass.associations = associations.dup
28
+ super
29
+ end
30
+
31
+ private
32
+ def create_association(type, name, options, &extension)
33
+ association = Associations::Base.new(type, name, options, &extension)
34
+ associations[association.name] = association
35
+
36
+ define_method(association.name) do
37
+ get_proxy(association)
38
+ end
39
+
40
+ define_method("#{association.name}=") do |value|
41
+ get_proxy(association).replace(value)
42
+ value
43
+ end
44
+
45
+ if association.one? || association.belongs_to?
46
+ define_method("#{association.name}?") do
47
+ get_proxy(association).present?
48
+ end
49
+ end
50
+
51
+ if association.options[:dependent] && association.many? && !association.embeddable?
52
+ after_destroy do |doc|
53
+ case association.options[:dependent]
54
+ when :destroy
55
+ doc.get_proxy(association).destroy_all
56
+ when :delete_all
57
+ doc.get_proxy(association).delete_all
58
+ when :nullify
59
+ doc.get_proxy(association).nullify
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ module InstanceMethods
67
+ def associations
68
+ self.class.associations
69
+ end
70
+
71
+ # @api private?
72
+ def embedded_associations
73
+ associations.select do |name, association|
74
+ association.embeddable?
75
+ end.map do |name, association|
76
+ association
77
+ end
78
+ end
79
+
80
+ def get_proxy(association)
81
+ unless proxy = self.instance_variable_get(association.ivar)
82
+ proxy = association.proxy_class.new(self, association)
83
+ self.instance_variable_set(association.ivar, proxy)
84
+ end
85
+
86
+ proxy
87
+ end
88
+
89
+ def save_to_collection(options = {})
90
+ super
91
+ associations.each do |association_name, association|
92
+ proxy = get_proxy(association)
93
+ proxy.save_to_collection(options) if proxy.proxy_respond_to?(:save_to_collection)
94
+ end
95
+ end
96
+ end
97
+
98
+ autoload :Base, 'mongo_mapper/plugins/associations/base'
99
+ autoload :Collection, 'mongo_mapper/plugins/associations/collection'
100
+ autoload :EmbeddedCollection, 'mongo_mapper/plugins/associations/embedded_collection'
101
+ autoload :ManyDocumentsProxy, 'mongo_mapper/plugins/associations/many_documents_proxy'
102
+ autoload :BelongsToProxy, 'mongo_mapper/plugins/associations/belongs_to_proxy'
103
+ autoload :BelongsToPolymorphicProxy, 'mongo_mapper/plugins/associations/belongs_to_polymorphic_proxy'
104
+ autoload :ManyPolymorphicProxy, 'mongo_mapper/plugins/associations/many_polymorphic_proxy'
105
+ autoload :ManyEmbeddedProxy, 'mongo_mapper/plugins/associations/many_embedded_proxy'
106
+ autoload :ManyEmbeddedPolymorphicProxy, 'mongo_mapper/plugins/associations/many_embedded_polymorphic_proxy'
107
+ autoload :ManyDocumentsAsProxy, 'mongo_mapper/plugins/associations/many_documents_as_proxy'
108
+ autoload :OneProxy, 'mongo_mapper/plugins/associations/one_proxy'
109
+ autoload :OneEmbeddedProxy, 'mongo_mapper/plugins/associations/one_embedded_proxy'
110
+ autoload :InArrayProxy, 'mongo_mapper/plugins/associations/in_array_proxy'
111
+ end
112
+ end
113
+ end
114
+
115
+ require 'mongo_mapper/plugins/associations/proxy'
@@ -1,124 +1,124 @@
1
- # encoding: UTF-8
2
- module MongoMapper
3
- module Plugins
4
- module Associations
5
- class Base
6
- attr_reader :type, :name, :options, :query_options
7
-
8
- # Options that should not be considered MongoDB query options/criteria
9
- AssociationOptions = [:as, :class, :class_name, :dependent, :extend, :foreign_key, :in, :polymorphic]
10
-
11
- def initialize(type, name, options={}, &extension)
12
- @type, @name, @options, @query_options, @original_options = type, name, {}, {}, options
13
- options.symbolize_keys!
14
- options[:extend] = modularized_extensions(extension, options[:extend])
15
- separate_options_and_conditions
16
- end
17
-
18
- def class_name
19
- return @class_name if defined?(@class_name)
20
-
21
- @class_name =
22
- if cn = options[:class_name]
23
- cn
24
- elsif many?
25
- name.to_s.singularize.camelize
26
- else
27
- name.to_s.camelize
28
- end
29
- end
30
-
31
- def klass
32
- @klass ||= options[:class] || class_name.constantize
33
- end
34
-
35
- def many?
36
- @type == :many
37
- end
38
-
39
- def belongs_to?
40
- @type == :belongs_to
41
- end
42
-
43
- def one?
44
- @type == :one
45
- end
46
-
47
- def polymorphic?
48
- !!@options[:polymorphic]
49
- end
50
-
51
- def as?
52
- !!@options[:as]
53
- end
54
-
55
- def in_array?
56
- !!@options[:in]
57
- end
58
-
59
- def embeddable?
60
- (one? || many?) && klass.embeddable?
61
- end
62
-
63
- def type_key_name
64
- many? ? '_type' : "#{as}_type"
65
- end
66
-
67
- def as
68
- @options[:as] || self.name
69
- end
70
-
71
- def foreign_key
72
- @options[:foreign_key] || "#{name}_id"
73
- end
74
-
75
- def ivar
76
- @ivar ||= "@_#{name}"
77
- end
78
-
79
- # hate this, need to revisit
80
- def proxy_class
81
- return @proxy_class if defined?(@proxy_class)
82
-
83
- @proxy_class =
84
- if many?
85
- if klass.embeddable?
86
- polymorphic? ? ManyEmbeddedPolymorphicProxy : ManyEmbeddedProxy
87
- else
88
- if polymorphic?
89
- ManyPolymorphicProxy
90
- elsif as?
91
- ManyDocumentsAsProxy
92
- elsif in_array?
93
- InArrayProxy
94
- else
95
- ManyDocumentsProxy
96
- end
97
- end
98
- elsif one?
99
- klass.embeddable? ? OneEmbeddedProxy : OneProxy
100
- else
101
- polymorphic? ? BelongsToPolymorphicProxy : BelongsToProxy
102
- end
103
- end
104
-
105
- private
106
- def separate_options_and_conditions
107
- @original_options.each_pair do |key, value|
108
- if AssociationOptions.include?(key)
109
- @options[key] = value
110
- else
111
- @query_options[key] = value
112
- end
113
- end
114
- end
115
-
116
- def modularized_extensions(*extensions)
117
- extensions.flatten.compact.map do |extension|
118
- Proc === extension ? Module.new(&extension) : extension
119
- end
120
- end
121
- end
122
- end
123
- end
124
- end
1
+ # encoding: UTF-8
2
+ module MongoMapper
3
+ module Plugins
4
+ module Associations
5
+ class Base
6
+ attr_reader :type, :name, :options, :query_options
7
+
8
+ # Options that should not be considered MongoDB query options/criteria
9
+ AssociationOptions = [:as, :class, :class_name, :dependent, :extend, :foreign_key, :in, :polymorphic]
10
+
11
+ def initialize(type, name, options={}, &extension)
12
+ @type, @name, @options, @query_options, @original_options = type, name, {}, {}, options
13
+ options.symbolize_keys!
14
+ options[:extend] = modularized_extensions(extension, options[:extend])
15
+ separate_options_and_conditions
16
+ end
17
+
18
+ def class_name
19
+ return @class_name if defined?(@class_name)
20
+
21
+ @class_name =
22
+ if cn = options[:class_name]
23
+ cn
24
+ elsif many?
25
+ name.to_s.singularize.camelize
26
+ else
27
+ name.to_s.camelize
28
+ end
29
+ end
30
+
31
+ def klass
32
+ @klass ||= options[:class] || class_name.constantize
33
+ end
34
+
35
+ def many?
36
+ @type == :many
37
+ end
38
+
39
+ def belongs_to?
40
+ @type == :belongs_to
41
+ end
42
+
43
+ def one?
44
+ @type == :one
45
+ end
46
+
47
+ def polymorphic?
48
+ !!@options[:polymorphic]
49
+ end
50
+
51
+ def as?
52
+ !!@options[:as]
53
+ end
54
+
55
+ def in_array?
56
+ !!@options[:in]
57
+ end
58
+
59
+ def embeddable?
60
+ (one? || many?) && klass.embeddable?
61
+ end
62
+
63
+ def type_key_name
64
+ many? ? '_type' : "#{as}_type"
65
+ end
66
+
67
+ def as
68
+ @options[:as] || self.name
69
+ end
70
+
71
+ def foreign_key
72
+ @options[:foreign_key] || "#{name}_id"
73
+ end
74
+
75
+ def ivar
76
+ @ivar ||= "@_#{name}"
77
+ end
78
+
79
+ # hate this, need to revisit
80
+ def proxy_class
81
+ return @proxy_class if defined?(@proxy_class)
82
+
83
+ @proxy_class =
84
+ if many?
85
+ if klass.embeddable?
86
+ polymorphic? ? ManyEmbeddedPolymorphicProxy : ManyEmbeddedProxy
87
+ else
88
+ if polymorphic?
89
+ ManyPolymorphicProxy
90
+ elsif as?
91
+ ManyDocumentsAsProxy
92
+ elsif in_array?
93
+ InArrayProxy
94
+ else
95
+ ManyDocumentsProxy
96
+ end
97
+ end
98
+ elsif one?
99
+ klass.embeddable? ? OneEmbeddedProxy : OneProxy
100
+ else
101
+ polymorphic? ? BelongsToPolymorphicProxy : BelongsToProxy
102
+ end
103
+ end
104
+
105
+ private
106
+ def separate_options_and_conditions
107
+ @original_options.each_pair do |key, value|
108
+ if AssociationOptions.include?(key)
109
+ @options[key] = value
110
+ else
111
+ @query_options[key] = value
112
+ end
113
+ end
114
+ end
115
+
116
+ def modularized_extensions(*extensions)
117
+ extensions.flatten.compact.map do |extension|
118
+ Proc === extension ? Module.new(&extension) : extension
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end