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.
- data/.gitignore +6 -0
- data/.watchr +29 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/caliper.yml +4 -0
- data/lib/mongoid.rb +20 -9
- data/lib/mongoid/associations.rb +100 -123
- data/lib/mongoid/associations/belongs_to_related.rb +3 -2
- data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
- data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
- data/lib/mongoid/associations/embedded_in.rb +4 -12
- data/lib/mongoid/associations/has_many_related.rb +4 -52
- data/lib/mongoid/associations/has_one_related.rb +4 -8
- data/lib/mongoid/associations/meta_data.rb +1 -2
- data/lib/mongoid/associations/options.rb +1 -6
- data/lib/mongoid/associations/proxy.rb +21 -14
- data/lib/mongoid/attributes.rb +13 -33
- data/lib/mongoid/callbacks.rb +11 -16
- data/lib/mongoid/collection.rb +3 -4
- data/lib/mongoid/collections/master.rb +2 -3
- data/lib/mongoid/collections/mimic.rb +46 -0
- data/lib/mongoid/collections/slaves.rb +2 -3
- data/lib/mongoid/commands.rb +161 -0
- data/lib/mongoid/commands/create.rb +19 -0
- data/lib/mongoid/commands/delete.rb +16 -0
- data/lib/mongoid/commands/delete_all.rb +23 -0
- data/lib/mongoid/commands/deletion.rb +18 -0
- data/lib/mongoid/commands/destroy.rb +17 -0
- data/lib/mongoid/commands/destroy_all.rb +23 -0
- data/lib/mongoid/commands/save.rb +29 -0
- data/lib/mongoid/components.rb +6 -4
- data/lib/mongoid/config.rb +15 -134
- data/lib/mongoid/contexts.rb +1 -1
- data/lib/mongoid/contexts/enumerable.rb +1 -1
- data/lib/mongoid/contexts/mongo.rb +1 -1
- data/lib/mongoid/contexts/paging.rb +2 -10
- data/lib/mongoid/criterion/inclusion.rb +0 -17
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/cursor.rb +1 -0
- data/lib/mongoid/document.rb +45 -49
- data/lib/mongoid/errors.rb +1 -32
- data/lib/mongoid/extensions.rb +10 -12
- data/lib/mongoid/extensions/array/conversions.rb +6 -8
- data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
- data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
- data/lib/mongoid/extensions/date/conversions.rb +4 -13
- data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
- data/lib/mongoid/extensions/float/conversions.rb +1 -5
- data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
- data/lib/mongoid/extensions/hash/conversions.rb +4 -34
- data/lib/mongoid/extensions/integer/conversions.rb +1 -5
- data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
- data/lib/mongoid/extensions/object/conversions.rb +2 -8
- data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
- data/lib/mongoid/extensions/string/conversions.rb +1 -1
- data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
- data/lib/mongoid/extensions/time/conversions.rb +18 -0
- data/lib/mongoid/factory.rb +1 -2
- data/lib/mongoid/field.rb +2 -9
- data/lib/mongoid/fields.rb +7 -11
- data/lib/mongoid/finders.rb +2 -2
- data/lib/mongoid/identity.rb +4 -4
- data/lib/mongoid/indexes.rb +7 -10
- data/lib/mongoid/memoization.rb +2 -8
- data/lib/mongoid/named_scope.rb +5 -0
- data/lib/mongoid/observable.rb +1 -1
- data/lib/mongoid/paths.rb +22 -30
- data/lib/mongoid/state.rb +21 -28
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/validations.rb +51 -0
- data/lib/mongoid/validations/associated.rb +32 -0
- data/lib/mongoid/validations/locale/en.yml +4 -0
- data/lib/mongoid/validations/uniqueness.rb +22 -0
- data/lib/mongoid/versioning.rb +1 -2
- data/mongoid.gemspec +408 -0
- data/perf/benchmark.rb +77 -0
- data/spec/integration/mongoid/associations_spec.rb +340 -0
- data/spec/integration/mongoid/attributes_spec.rb +22 -0
- data/spec/integration/mongoid/commands_spec.rb +227 -0
- data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
- data/spec/integration/mongoid/criteria_spec.rb +272 -0
- data/spec/integration/mongoid/document_spec.rb +650 -0
- data/spec/integration/mongoid/extensions_spec.rb +22 -0
- data/spec/integration/mongoid/finders_spec.rb +119 -0
- data/spec/integration/mongoid/inheritance_spec.rb +137 -0
- data/spec/integration/mongoid/named_scope_spec.rb +46 -0
- data/spec/models/address.rb +39 -0
- data/spec/models/animal.rb +6 -0
- data/spec/models/callbacks.rb +18 -0
- data/spec/models/comment.rb +8 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/game.rb +7 -0
- data/spec/models/inheritance.rb +56 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/patient.rb +4 -0
- data/spec/models/person.rb +99 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/post.rb +15 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_helper.rb +31 -0
- data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
- data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
- data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
- data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
- data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
- data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
- data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
- data/spec/unit/mongoid/associations/options_spec.rb +192 -0
- data/spec/unit/mongoid/associations_spec.rb +595 -0
- data/spec/unit/mongoid/attributes_spec.rb +507 -0
- data/spec/unit/mongoid/callbacks_spec.rb +55 -0
- data/spec/unit/mongoid/collection_spec.rb +187 -0
- data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
- data/spec/unit/mongoid/collections/master_spec.rb +41 -0
- data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
- data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
- data/spec/unit/mongoid/commands/create_spec.rb +31 -0
- data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
- data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
- data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
- data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
- data/spec/unit/mongoid/commands/save_spec.rb +107 -0
- data/spec/unit/mongoid/commands_spec.rb +270 -0
- data/spec/unit/mongoid/config_spec.rb +172 -0
- data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
- data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
- data/spec/unit/mongoid/contexts_spec.rb +25 -0
- data/spec/unit/mongoid/criteria_spec.rb +824 -0
- data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
- data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
- data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
- data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
- data/spec/unit/mongoid/cursor_spec.rb +74 -0
- data/spec/unit/mongoid/deprecation_spec.rb +24 -0
- data/spec/unit/mongoid/document_spec.rb +818 -0
- data/spec/unit/mongoid/errors_spec.rb +103 -0
- data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
- data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
- data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
- data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
- data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
- data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
- data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
- data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
- data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
- data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
- data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
- data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
- data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
- data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
- data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
- data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
- data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
- data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
- data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
- data/spec/unit/mongoid/extras_spec.rb +102 -0
- data/spec/unit/mongoid/factory_spec.rb +31 -0
- data/spec/unit/mongoid/field_spec.rb +143 -0
- data/spec/unit/mongoid/fields_spec.rb +181 -0
- data/spec/unit/mongoid/finders_spec.rb +404 -0
- data/spec/unit/mongoid/identity_spec.rb +109 -0
- data/spec/unit/mongoid/indexes_spec.rb +93 -0
- data/spec/unit/mongoid/javascript_spec.rb +48 -0
- data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
- data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
- data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
- data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
- data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
- data/spec/unit/mongoid/matchers_spec.rb +329 -0
- data/spec/unit/mongoid/memoization_spec.rb +75 -0
- data/spec/unit/mongoid/named_scope_spec.rb +123 -0
- data/spec/unit/mongoid/observable_spec.rb +46 -0
- data/spec/unit/mongoid/paths_spec.rb +124 -0
- data/spec/unit/mongoid/scope_spec.rb +240 -0
- data/spec/unit/mongoid/state_spec.rb +83 -0
- data/spec/unit/mongoid/timestamps_spec.rb +25 -0
- data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
- data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
- data/spec/unit/mongoid/validations_spec.rb +190 -0
- data/spec/unit/mongoid/versioning_spec.rb +41 -0
- data/spec/unit/mongoid_spec.rb +46 -0
- metadata +316 -110
- data/lib/mongoid/collections.rb +0 -41
- data/lib/mongoid/concern.rb +0 -31
- data/lib/mongoid/dirty.rb +0 -253
- data/lib/mongoid/extensions/time_conversions.rb +0 -35
- data/lib/mongoid/persistence.rb +0 -222
- data/lib/mongoid/persistence/command.rb +0 -39
- data/lib/mongoid/persistence/insert.rb +0 -50
- data/lib/mongoid/persistence/insert_embedded.rb +0 -38
- data/lib/mongoid/persistence/remove.rb +0 -39
- data/lib/mongoid/persistence/remove_all.rb +0 -37
- data/lib/mongoid/persistence/remove_embedded.rb +0 -50
- data/lib/mongoid/persistence/update.rb +0 -63
- 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
|
-
|
5
|
-
|
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
|
-
|
5
|
-
|
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
|
-
|
59
|
-
|
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
|
101
|
+
def initialize(parent, options)
|
131
102
|
@parent, @association_name = parent, options.name
|
132
103
|
@klass, @options = options.klass, options
|
133
|
-
|
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
|
150
|
+
criteria.paginate
|
186
151
|
end
|
187
152
|
|
188
153
|
protected
|
189
154
|
# Initializes each of the attributes in the hash.
|
190
|
-
def
|
191
|
-
@target =
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
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 +
|
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
|
231
|
-
new(document, options
|
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
|
-
:
|
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.
|
186
|
+
parent.remove_attribute(options.name)
|
244
187
|
children.assimilate(parent, options)
|
245
|
-
|
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
|
-
|
5
|
-
|
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 +
|
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 +
|
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
|
-
:
|
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>
|
82
|
+
# <tt>EmbedOne.update({:first_name => "Hank"}, person, options)</tt>
|
84
83
|
#
|
85
84
|
# Returns:
|
86
85
|
#
|
87
|
-
# A new +
|
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
|
-
|
5
|
-
|
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
|
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,
|
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
|
-
|
5
|
-
|
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
|
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
|
-
|
5
|
-
|
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
|
-
|
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 =
|
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
|
@@ -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
|
-
|
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
|