mongoid 1.9.5 → 2.0.0.alpha

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 (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