mongoid 1.9.5 → 2.0.0.alpha

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/Rakefile +52 -0
  4. data/VERSION +1 -0
  5. data/caliper.yml +4 -0
  6. data/lib/mongoid.rb +20 -9
  7. data/lib/mongoid/associations.rb +100 -123
  8. data/lib/mongoid/associations/belongs_to_related.rb +3 -2
  9. data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
  10. data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
  11. data/lib/mongoid/associations/embedded_in.rb +4 -12
  12. data/lib/mongoid/associations/has_many_related.rb +4 -52
  13. data/lib/mongoid/associations/has_one_related.rb +4 -8
  14. data/lib/mongoid/associations/meta_data.rb +1 -2
  15. data/lib/mongoid/associations/options.rb +1 -6
  16. data/lib/mongoid/associations/proxy.rb +21 -14
  17. data/lib/mongoid/attributes.rb +13 -33
  18. data/lib/mongoid/callbacks.rb +11 -16
  19. data/lib/mongoid/collection.rb +3 -4
  20. data/lib/mongoid/collections/master.rb +2 -3
  21. data/lib/mongoid/collections/mimic.rb +46 -0
  22. data/lib/mongoid/collections/slaves.rb +2 -3
  23. data/lib/mongoid/commands.rb +161 -0
  24. data/lib/mongoid/commands/create.rb +19 -0
  25. data/lib/mongoid/commands/delete.rb +16 -0
  26. data/lib/mongoid/commands/delete_all.rb +23 -0
  27. data/lib/mongoid/commands/deletion.rb +18 -0
  28. data/lib/mongoid/commands/destroy.rb +17 -0
  29. data/lib/mongoid/commands/destroy_all.rb +23 -0
  30. data/lib/mongoid/commands/save.rb +29 -0
  31. data/lib/mongoid/components.rb +6 -4
  32. data/lib/mongoid/config.rb +15 -134
  33. data/lib/mongoid/contexts.rb +1 -1
  34. data/lib/mongoid/contexts/enumerable.rb +1 -1
  35. data/lib/mongoid/contexts/mongo.rb +1 -1
  36. data/lib/mongoid/contexts/paging.rb +2 -10
  37. data/lib/mongoid/criterion/inclusion.rb +0 -17
  38. data/lib/mongoid/criterion/optional.rb +1 -1
  39. data/lib/mongoid/cursor.rb +1 -0
  40. data/lib/mongoid/document.rb +45 -49
  41. data/lib/mongoid/errors.rb +1 -32
  42. data/lib/mongoid/extensions.rb +10 -12
  43. data/lib/mongoid/extensions/array/conversions.rb +6 -8
  44. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  45. data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
  46. data/lib/mongoid/extensions/date/conversions.rb +4 -13
  47. data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
  48. data/lib/mongoid/extensions/float/conversions.rb +1 -5
  49. data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
  50. data/lib/mongoid/extensions/hash/conversions.rb +4 -34
  51. data/lib/mongoid/extensions/integer/conversions.rb +1 -5
  52. data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
  53. data/lib/mongoid/extensions/object/conversions.rb +2 -8
  54. data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
  55. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  56. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  57. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  58. data/lib/mongoid/factory.rb +1 -2
  59. data/lib/mongoid/field.rb +2 -9
  60. data/lib/mongoid/fields.rb +7 -11
  61. data/lib/mongoid/finders.rb +2 -2
  62. data/lib/mongoid/identity.rb +4 -4
  63. data/lib/mongoid/indexes.rb +7 -10
  64. data/lib/mongoid/memoization.rb +2 -8
  65. data/lib/mongoid/named_scope.rb +5 -0
  66. data/lib/mongoid/observable.rb +1 -1
  67. data/lib/mongoid/paths.rb +22 -30
  68. data/lib/mongoid/state.rb +21 -28
  69. data/lib/mongoid/timestamps.rb +1 -1
  70. data/lib/mongoid/validations.rb +51 -0
  71. data/lib/mongoid/validations/associated.rb +32 -0
  72. data/lib/mongoid/validations/locale/en.yml +4 -0
  73. data/lib/mongoid/validations/uniqueness.rb +22 -0
  74. data/lib/mongoid/versioning.rb +1 -2
  75. data/mongoid.gemspec +408 -0
  76. data/perf/benchmark.rb +77 -0
  77. data/spec/integration/mongoid/associations_spec.rb +340 -0
  78. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  79. data/spec/integration/mongoid/commands_spec.rb +227 -0
  80. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  81. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  82. data/spec/integration/mongoid/document_spec.rb +650 -0
  83. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  84. data/spec/integration/mongoid/finders_spec.rb +119 -0
  85. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  86. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  87. data/spec/models/address.rb +39 -0
  88. data/spec/models/animal.rb +6 -0
  89. data/spec/models/callbacks.rb +18 -0
  90. data/spec/models/comment.rb +8 -0
  91. data/spec/models/country_code.rb +6 -0
  92. data/spec/models/employer.rb +5 -0
  93. data/spec/models/game.rb +7 -0
  94. data/spec/models/inheritance.rb +56 -0
  95. data/spec/models/location.rb +5 -0
  96. data/spec/models/mixed_drink.rb +4 -0
  97. data/spec/models/name.rb +13 -0
  98. data/spec/models/namespacing.rb +11 -0
  99. data/spec/models/patient.rb +4 -0
  100. data/spec/models/person.rb +99 -0
  101. data/spec/models/pet.rb +7 -0
  102. data/spec/models/pet_owner.rb +6 -0
  103. data/spec/models/phone.rb +7 -0
  104. data/spec/models/post.rb +15 -0
  105. data/spec/models/translation.rb +5 -0
  106. data/spec/models/vet_visit.rb +5 -0
  107. data/spec/spec.opts +3 -0
  108. data/spec/spec_helper.rb +31 -0
  109. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  110. data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
  111. data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
  112. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  113. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  114. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  115. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  116. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  117. data/spec/unit/mongoid/associations_spec.rb +595 -0
  118. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  119. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  120. data/spec/unit/mongoid/collection_spec.rb +187 -0
  121. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  122. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  123. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  124. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  125. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  126. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  127. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  128. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  129. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  130. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  131. data/spec/unit/mongoid/commands_spec.rb +270 -0
  132. data/spec/unit/mongoid/config_spec.rb +172 -0
  133. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  134. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  135. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  136. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  137. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  138. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  139. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  140. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  141. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  142. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  143. data/spec/unit/mongoid/document_spec.rb +818 -0
  144. data/spec/unit/mongoid/errors_spec.rb +103 -0
  145. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  146. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  147. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  148. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  149. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  150. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  151. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  152. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  153. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  154. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  155. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  156. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  157. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  158. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  159. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  160. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  161. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  162. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  163. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  164. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  165. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  166. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  167. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  168. data/spec/unit/mongoid/extras_spec.rb +102 -0
  169. data/spec/unit/mongoid/factory_spec.rb +31 -0
  170. data/spec/unit/mongoid/field_spec.rb +143 -0
  171. data/spec/unit/mongoid/fields_spec.rb +181 -0
  172. data/spec/unit/mongoid/finders_spec.rb +404 -0
  173. data/spec/unit/mongoid/identity_spec.rb +109 -0
  174. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  175. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  176. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  177. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  178. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  179. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  180. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  181. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  182. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  183. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  184. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  185. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  186. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  187. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  188. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  189. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  190. data/spec/unit/mongoid/observable_spec.rb +46 -0
  191. data/spec/unit/mongoid/paths_spec.rb +124 -0
  192. data/spec/unit/mongoid/scope_spec.rb +240 -0
  193. data/spec/unit/mongoid/state_spec.rb +83 -0
  194. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  195. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  196. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  197. data/spec/unit/mongoid/validations_spec.rb +190 -0
  198. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  199. data/spec/unit/mongoid_spec.rb +46 -0
  200. metadata +316 -110
  201. data/lib/mongoid/collections.rb +0 -41
  202. data/lib/mongoid/concern.rb +0 -31
  203. data/lib/mongoid/dirty.rb +0 -253
  204. data/lib/mongoid/extensions/time_conversions.rb +0 -35
  205. data/lib/mongoid/persistence.rb +0 -222
  206. data/lib/mongoid/persistence/command.rb +0 -39
  207. data/lib/mongoid/persistence/insert.rb +0 -50
  208. data/lib/mongoid/persistence/insert_embedded.rb +0 -38
  209. data/lib/mongoid/persistence/remove.rb +0 -39
  210. data/lib/mongoid/persistence/remove_all.rb +0 -37
  211. data/lib/mongoid/persistence/remove_embedded.rb +0 -50
  212. data/lib/mongoid/persistence/update.rb +0 -63
  213. data/lib/mongoid/version.rb +0 -4
@@ -1,8 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # Represents a relational association to a "parent" object.
5
- class BelongsToRelated < Proxy
4
+ class BelongsToRelated #:nodoc:
5
+ include Proxy
6
6
 
7
7
  # Initializing a related association only requires looking up the object
8
8
  # by its id.
@@ -53,6 +53,7 @@ module Mongoid #:nodoc:
53
53
  instantiate(document, options, target)
54
54
  end
55
55
  end
56
+
56
57
  end
57
58
  end
58
59
  end
@@ -1,9 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # Represents embedding many documents within a parent document, which will
5
- # be an array as the underlying storage mechanism.
6
- class EmbedsMany < Proxy
4
+ class EmbedMany
5
+ include Proxy
7
6
 
8
7
  attr_accessor :association_name, :klass
9
8
 
@@ -13,7 +12,6 @@ module Mongoid #:nodoc:
13
12
  documents.flatten.each do |doc|
14
13
  doc.parentize(@parent, @association_name)
15
14
  @target << doc
16
- doc._index = @target.size - 1
17
15
  doc.notify
18
16
  end
19
17
  end
@@ -21,6 +19,15 @@ module Mongoid #:nodoc:
21
19
  alias :concat :<<
22
20
  alias :push :<<
23
21
 
22
+ # Clears the association, and notifies the parents of the removal.
23
+ def clear
24
+ unless @target.empty?
25
+ document = @target.first
26
+ document.notify_observers(document, true)
27
+ @target.clear
28
+ end
29
+ end
30
+
24
31
  # Builds a new Document and adds it to the association collection. The
25
32
  # document created will be of the same class as the others in the
26
33
  # association, and the attributes will be passed into the constructor.
@@ -33,19 +40,9 @@ module Mongoid #:nodoc:
33
40
  document.parentize(@parent, @association_name)
34
41
  document.write_attributes(attrs)
35
42
  @target << document
36
- document._index = @target.size - 1
37
43
  document
38
44
  end
39
45
 
40
- # Clears the association, and notifies the parents of the removal.
41
- def clear
42
- unless @target.empty?
43
- document = @target.first
44
- document.notify_observers(document, true)
45
- @target.clear
46
- end
47
- end
48
-
49
46
  # Creates a new Document and adds it to the association collection. The
50
47
  # document created will be of the same class as the others in the
51
48
  # association, and the attributes will be passed into the constructor and
@@ -55,8 +52,8 @@ module Mongoid #:nodoc:
55
52
  #
56
53
  # The newly created Document.
57
54
  def create(attrs = {}, type = nil)
58
- document = build(attrs, type)
59
- document.save; document
55
+ object = build(attrs, type)
56
+ object.run_callbacks(:create) { object.save }; object
60
57
  end
61
58
 
62
59
  # Creates a new Document and adds it to the association collection. The
@@ -75,32 +72,6 @@ module Mongoid #:nodoc:
75
72
  document
76
73
  end
77
74
 
78
- # Delete all the documents in the association without running callbacks.
79
- #
80
- # Example:
81
- #
82
- # <tt>addresses.delete_all</tt>
83
- #
84
- # Returns:
85
- #
86
- # The number of documents deleted.
87
- def delete_all(conditions = {})
88
- remove(:delete, conditions)
89
- end
90
-
91
- # Delete all the documents in the association and run destroy callbacks.
92
- #
93
- # Example:
94
- #
95
- # <tt>addresses.destroy_all</tt>
96
- #
97
- # Returns:
98
- #
99
- # The number of documents destroyed.
100
- def destroy_all(conditions = {})
101
- remove(:destroy, conditions)
102
- end
103
-
104
75
  # Finds a document in this association.
105
76
  #
106
77
  # If :all is passed, returns all the documents
@@ -127,19 +98,13 @@ module Mongoid #:nodoc:
127
98
  #
128
99
  # parent: The parent document to the association.
129
100
  # options: The association options.
130
- def initialize(parent, options, target_array = nil)
101
+ def initialize(parent, options)
131
102
  @parent, @association_name = parent, options.name
132
103
  @klass, @options = options.klass, options
133
- if target_array
134
- build_children_from_target_array(target_array)
135
- else
136
- build_children_from_attributes(parent.raw_attributes[@association_name])
137
- end
104
+ initialize_each(parent.raw_attributes[@association_name])
138
105
  extends(options)
139
106
  end
140
107
 
141
-
142
-
143
108
  # If the target array does not respond to the supplied method then try to
144
109
  # find a named scope or criteria on the class and send the call there.
145
110
  #
@@ -182,71 +147,45 @@ module Mongoid #:nodoc:
182
147
  def paginate(options)
183
148
  criteria = Mongoid::Criteria.translate(@klass, options)
184
149
  criteria.documents = @target
185
- criteria.paginate(options)
150
+ criteria.paginate
186
151
  end
187
152
 
188
153
  protected
189
154
  # Initializes each of the attributes in the hash.
190
- def build_children_from_attributes(attributes)
191
- @target = []
192
- if attributes
193
- attributes.each_with_index do |attrs, index|
194
- klass = attrs.klass
195
- child = klass ? klass.instantiate(attrs) : @klass.instantiate(attrs)
196
- child.parentize(@parent, @association_name)
197
- child._index = index
198
- @target << child
199
- end
200
- end
201
- end
202
-
203
- # Initializes the target array from an existing array of documents.
204
- def build_children_from_target_array(target_array)
205
- @target = target_array
206
- @target.each_with_index do |child, index|
207
- child._index = index
208
- end
209
- end
210
-
211
- # Removes documents based on a method.
212
- def remove(method, conditions)
213
- criteria = @klass.find(conditions || {})
214
- criteria.documents = @target
215
- count = criteria.size
216
- criteria.each do |doc|
217
- @target.delete(doc); doc.send(method)
218
- end; count
155
+ def initialize_each(attributes)
156
+ @target = attributes ? attributes.collect do |attrs|
157
+ klass = attrs.klass
158
+ child = klass ? klass.instantiate(attrs) : @klass.instantiate(attrs)
159
+ child.parentize(@parent, @association_name)
160
+ child
161
+ end : []
219
162
  end
220
163
 
221
164
  class << self
222
165
 
223
- # Preferred method of creating a new +EmbedsMany+ association. It will
166
+ # Preferred method of creating a new +EmbedMany+ association. It will
224
167
  # delegate to new.
225
168
  #
226
169
  # Options:
227
170
  #
228
171
  # document: The parent +Document+
229
172
  # options: The association options
230
- def instantiate(document, options, target_array = nil)
231
- new(document, options, target_array)
173
+ def instantiate(document, options)
174
+ new(document, options)
232
175
  end
233
176
 
234
177
  # Returns the macro used to create the association.
235
178
  def macro
236
- :embeds_many
179
+ :embed_many
237
180
  end
238
181
 
239
182
  # Perform an update of the relationship of the parent and child. This
240
183
  # is initialized by setting the has_many to the supplied +Enumerable+
241
184
  # and setting up the parentization.
242
185
  def update(children, parent, options)
243
- parent.raw_attributes.delete(options.name)
186
+ parent.remove_attribute(options.name)
244
187
  children.assimilate(parent, options)
245
- if children && children.first.is_a?(Mongoid::Document)
246
- instantiate(parent, options, children)
247
- else
248
- instantiate(parent, options)
249
- end
188
+ instantiate(parent, options)
250
189
  end
251
190
  end
252
191
  end
@@ -1,9 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # Represents an association that is embedded in a parent document as a
5
- # one-to-one relationship.
6
- class EmbedsOne < Proxy
4
+ class EmbedOne #:nodoc:
5
+ include Proxy
7
6
 
8
7
  # Build a new object for the association.
9
8
  def build(attrs = {}, type = nil)
@@ -47,7 +46,7 @@ module Mongoid #:nodoc:
47
46
  end
48
47
 
49
48
  class << self
50
- # Preferred method of instantiating a new +EmbedsOne+, since nil values
49
+ # Preferred method of instantiating a new +EmbedOne+, since nil values
51
50
  # will be handled properly.
52
51
  #
53
52
  # Options:
@@ -57,7 +56,7 @@ module Mongoid #:nodoc:
57
56
  #
58
57
  # Returns:
59
58
  #
60
- # A new +EmbedsOne+ association proxy.
59
+ # A new +EmbedOne+ association proxy.
61
60
  def instantiate(document, options)
62
61
  attributes = document.raw_attributes[options.name]
63
62
  return nil if attributes.blank?
@@ -66,7 +65,7 @@ module Mongoid #:nodoc:
66
65
 
67
66
  # Returns the macro used to create the association.
68
67
  def macro
69
- :embeds_one
68
+ :embed_one
70
69
  end
71
70
 
72
71
  # Perform an update of the relationship of the parent and child. This
@@ -80,11 +79,11 @@ module Mongoid #:nodoc:
80
79
  #
81
80
  # Example:
82
81
  #
83
- # <tt>EmbedsOne.update({:first_name => "Hank"}, person, options)</tt>
82
+ # <tt>EmbedOne.update({:first_name => "Hank"}, person, options)</tt>
84
83
  #
85
84
  # Returns:
86
85
  #
87
- # A new +EmbedsOne+ association proxy.
86
+ # A new +EmbedOne+ association proxy.
88
87
  def update(child, parent, options)
89
88
  child.assimilate(parent, options)
90
89
  instantiate(parent, options)
@@ -1,9 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # Represents an association that is embedded within another document in the
5
- # database, either as one or many.
6
- class EmbeddedIn < Proxy
4
+ class EmbeddedIn #:nodoc:
5
+ include Proxy
7
6
 
8
7
  # Creates the new association by setting the internal
9
8
  # target as the passed in Document. This should be the
@@ -49,23 +48,16 @@ module Mongoid #:nodoc:
49
48
 
50
49
  # Perform an update of the relationship of the parent and child. This
51
50
  # is initialized by setting a parent object as the association on the
52
- # +Document+. Will properly set an embeds_one or an embeds_many.
51
+ # +Document+. Will properly set an embed_one or an embed_many.
53
52
  #
54
53
  # Returns:
55
54
  #
56
55
  # A new +EmbeddedIn+ association proxy.
57
56
  def update(target, child, options)
58
- child.parentize(target, determine_name(target, options))
57
+ child.parentize(target, options.inverse_of)
59
58
  child.notify
60
59
  instantiate(child, options)
61
60
  end
62
-
63
- protected
64
- def determine_name(target, options)
65
- inverse = options.inverse_of
66
- return inverse unless inverse.is_a?(Array)
67
- inverse.detect { |name| target.respond_to?(name) }
68
- end
69
61
  end
70
62
  end
71
63
  end
@@ -1,9 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # Represents an relational one-to-many association with an object in a
5
- # separate collection or database.
6
- class HasManyRelated < Proxy
4
+ class HasManyRelated #:nodoc:
5
+ include Proxy
7
6
 
8
7
  # Appends the object to the +Array+, setting its parent in
9
8
  # the process.
@@ -42,42 +41,7 @@ module Mongoid #:nodoc:
42
41
  # Returns the newly created object.
43
42
  def create(attributes)
44
43
  object = build(attributes)
45
- object.save; object
46
- end
47
-
48
- # Creates a new Document and adds it to the association collection. If
49
- # validation fails an error is raised.
50
- #
51
- # Returns the newly created object.
52
- def create!(attributes)
53
- object = build(attributes)
54
- object.save!; object
55
- end
56
-
57
- # Delete all the associated objects.
58
- #
59
- # Example:
60
- #
61
- # <tt>person.posts.delete_all</tt>
62
- #
63
- # Returns:
64
- #
65
- # The number of objects deleted.
66
- def delete_all(conditions = {})
67
- remove(:delete_all, conditions[:conditions])
68
- end
69
-
70
- # Destroy all the associated objects.
71
- #
72
- # Example:
73
- #
74
- # <tt>person.posts.destroy_all</tt>
75
- #
76
- # Returns:
77
- #
78
- # The number of objects destroyed.
79
- def destroy_all(conditions = {})
80
- remove(:destroy_all, conditions[:conditions])
44
+ object.run_callbacks(:create) { object.save }; object
81
45
  end
82
46
 
83
47
  # Finds a document in this association.
@@ -95,7 +59,7 @@ module Mongoid #:nodoc:
95
59
  # document: The +Document+ that contains the relationship.
96
60
  # options: The association +Options+.
97
61
  def initialize(document, options, target = nil)
98
- @parent, @klass, @options = document, options.klass, options
62
+ @parent, @klass = document, options.klass
99
63
  @foreign_key = options.foreign_key
100
64
  @base = lambda { @klass.all(:conditions => { @foreign_key => document.id }) }
101
65
  @target = target || @base.call
@@ -129,18 +93,6 @@ module Mongoid #:nodoc:
129
93
  @target = @target.entries if @parent.new_record?
130
94
  end
131
95
 
132
- # Remove the objects based on conditions.
133
- def remove(method, conditions)
134
- selector = { @foreign_key => @parent.id }.merge(conditions || {})
135
- removed = @klass.send(method, :conditions => selector)
136
- reset; removed
137
- end
138
-
139
- # Reset the memoized association on the parent.
140
- def reset
141
- @parent.send(:reset, @options.name) { @base.call }
142
- end
143
-
144
96
  class << self
145
97
  # Preferred method for creating the new +HasManyRelated+ association.
146
98
  #
@@ -1,9 +1,8 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # Represents an relational one-to-one association with an object in a
5
- # separate collection or database.
6
- class HasOneRelated < Proxy
4
+ class HasOneRelated #:nodoc:
5
+ include Proxy
7
6
 
8
7
  delegate :nil?, :to => :target
9
8
 
@@ -12,10 +11,7 @@ module Mongoid #:nodoc:
12
11
  # Returns the newly created object.
13
12
  def build(attributes = {})
14
13
  @target = @klass.instantiate(attributes)
15
- inverse = @target.associations.values.detect do |metadata|
16
- metadata.options.klass == @parent.class
17
- end
18
- name = inverse.name
14
+ name = @parent.class.to_s.underscore
19
15
  @target.send("#{name}=", @parent)
20
16
  @target
21
17
  end
@@ -37,7 +33,7 @@ module Mongoid #:nodoc:
37
33
  # options: The association +Options+.
38
34
  def initialize(document, options, target = nil)
39
35
  @parent, @klass = document, options.klass
40
- @foreign_key = options.foreign_key
36
+ @foreign_key = document.class.to_s.foreign_key
41
37
  @target = target || @klass.first(:conditions => { @foreign_key => @parent.id })
42
38
  extends(options)
43
39
  end
@@ -1,8 +1,7 @@
1
1
  # encoding: utf-8
2
2
  module Mongoid #:nodoc:
3
3
  module Associations #:nodoc:
4
- # This class contains metadata about association proxies.
5
- class MetaData
4
+ class MetaData #:nodoc:
6
5
 
7
6
  attr_reader :association, :options
8
7
 
@@ -21,8 +21,7 @@ module Mongoid #:nodoc:
21
21
 
22
22
  # Return the foreign key based off the association name.
23
23
  def foreign_key
24
- key = @attributes[:foreign_key] || klass.name.to_s.foreign_key
25
- key.to_s
24
+ @attributes[:foreign_key] || klass.name.to_s.foreign_key
26
25
  end
27
26
 
28
27
  # Returns the name of the inverse_of association
@@ -48,10 +47,6 @@ module Mongoid #:nodoc:
48
47
  @attributes[:polymorphic] == true
49
48
  end
50
49
 
51
- # Used with has_many_related to save as array of ids.
52
- def stored_as
53
- @attributes[:stored_as]
54
- end
55
50
  end
56
51
  end
57
52
  end