mongoid 2.0.0.rc.7 → 2.0.0.rc.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.
- data/lib/config/locales/en.yml +3 -0
- data/lib/config/locales/id.yml +46 -0
- data/lib/config/locales/ja.yml +40 -0
- data/lib/config/locales/vi.yml +45 -0
- data/lib/mongoid.rb +5 -3
- data/lib/mongoid/attributes.rb +24 -63
- data/lib/mongoid/attributes/processing.rb +5 -2
- data/lib/mongoid/callbacks.rb +10 -0
- data/lib/mongoid/collection.rb +24 -0
- data/lib/mongoid/collections/master.rb +14 -6
- data/lib/mongoid/collections/operations.rb +1 -1
- data/lib/mongoid/collections/retry.rb +39 -0
- data/lib/mongoid/collections/slaves.rb +26 -10
- data/lib/mongoid/components.rb +4 -4
- data/lib/mongoid/config.rb +6 -3
- data/lib/mongoid/contexts.rb +0 -1
- data/lib/mongoid/contexts/enumerable.rb +19 -7
- data/lib/mongoid/contexts/mongo.rb +9 -5
- data/lib/mongoid/copyable.rb +10 -8
- data/lib/mongoid/criteria.rb +83 -61
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/creational.rb +2 -2
- data/lib/mongoid/criterion/exclusion.rb +58 -32
- data/lib/mongoid/criterion/inclusion.rb +49 -10
- data/lib/mongoid/criterion/optional.rb +1 -1
- data/lib/mongoid/criterion/selector.rb +80 -11
- data/lib/mongoid/cursor.rb +6 -1
- data/lib/mongoid/default_scope.rb +27 -19
- data/lib/mongoid/document.rb +26 -1
- data/lib/mongoid/errors.rb +1 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +7 -4
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/field.rb +47 -30
- data/lib/mongoid/fields.rb +9 -2
- data/lib/mongoid/finders.rb +15 -49
- data/lib/mongoid/identity.rb +6 -4
- data/lib/mongoid/keys.rb +85 -31
- data/lib/mongoid/multi_parameter_attributes.rb +2 -2
- data/lib/mongoid/named_scope.rb +129 -28
- data/lib/mongoid/observer.rb +36 -0
- data/lib/mongoid/paranoia.rb +3 -3
- data/lib/mongoid/paths.rb +1 -1
- data/lib/mongoid/persistence.rb +2 -0
- data/lib/mongoid/persistence/atomic.rb +88 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +30 -0
- data/lib/mongoid/persistence/atomic/inc.rb +28 -0
- data/lib/mongoid/persistence/atomic/operation.rb +44 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +33 -0
- data/lib/mongoid/persistence/atomic/push.rb +28 -0
- data/lib/mongoid/railtie.rb +13 -1
- data/lib/mongoid/relations.rb +1 -0
- data/lib/mongoid/relations/accessors.rb +20 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +17 -6
- data/lib/mongoid/relations/builders/referenced/many.rb +2 -1
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -0
- data/lib/mongoid/relations/embedded/atomic.rb +86 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/many.rb +57 -25
- data/lib/mongoid/relations/macros.rb +6 -4
- data/lib/mongoid/relations/many.rb +51 -10
- data/lib/mongoid/relations/metadata.rb +4 -2
- data/lib/mongoid/relations/proxy.rb +39 -24
- data/lib/mongoid/relations/referenced/many.rb +47 -26
- data/lib/mongoid/relations/referenced/many_to_many.rb +47 -14
- data/lib/mongoid/relations/referenced/one.rb +14 -0
- data/lib/mongoid/sharding.rb +51 -0
- data/lib/mongoid/state.rb +3 -2
- data/lib/mongoid/timestamps.rb +5 -29
- data/lib/mongoid/timestamps/created.rb +31 -0
- data/lib/mongoid/timestamps/updated.rb +33 -0
- data/lib/mongoid/validations.rb +10 -3
- data/lib/mongoid/validations/referenced.rb +58 -0
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +67 -5
- data/lib/rails/generators/mongoid/model/templates/model.rb +2 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb +4 -0
- data/lib/rails/generators/mongoid_generator.rb +10 -1
- data/lib/rails/mongoid.rb +1 -0
- metadata +29 -8
- data/lib/mongoid/contexts/ids.rb +0 -25
- data/lib/mongoid/modifiers.rb +0 -24
- data/lib/mongoid/modifiers/command.rb +0 -18
- data/lib/mongoid/modifiers/inc.rb +0 -24
@@ -208,7 +208,8 @@ module Mongoid # :nodoc:
|
|
208
208
|
# @since 2.0.0.rc.1
|
209
209
|
def inverse_foreign_key
|
210
210
|
@inverse_foreign_key ||=
|
211
|
-
(inverse_class_name.underscore <<
|
211
|
+
( inverse_of ? inverse_of.to_s.singularize : inverse_class_name.underscore ) <<
|
212
|
+
relation.foreign_key_suffix
|
212
213
|
end
|
213
214
|
|
214
215
|
# Returns the inverse class of the proxied relation.
|
@@ -402,8 +403,9 @@ module Mongoid # :nodoc:
|
|
402
403
|
#
|
403
404
|
# @since 2.0.0.rc.1
|
404
405
|
def determine_cyclic_inverse
|
406
|
+
underscored = class_name.underscore
|
405
407
|
klass.relations.each_pair do |key, meta|
|
406
|
-
if key =~ /#{
|
408
|
+
if key =~ /#{underscored.singularize}|#{underscored.pluralize}/ &&
|
407
409
|
meta.relation != relation
|
408
410
|
return key.to_sym
|
409
411
|
end
|
@@ -14,7 +14,7 @@ module Mongoid # :nodoc:
|
|
14
14
|
|
15
15
|
attr_accessor :base, :loaded, :metadata, :target
|
16
16
|
|
17
|
-
# Backwards
|
17
|
+
# Backwards compatibility with Mongoid beta releases.
|
18
18
|
delegate :klass, :to => :metadata
|
19
19
|
|
20
20
|
# Convenience for setting the target and the metadata properties since
|
@@ -29,37 +29,24 @@ module Mongoid # :nodoc:
|
|
29
29
|
#
|
30
30
|
# @since 2.0.0.rc.1
|
31
31
|
def init(base, target, metadata, &block)
|
32
|
-
@base, @
|
33
|
-
|
32
|
+
@base, @target, @metadata = base, target, metadata
|
33
|
+
block.call if block
|
34
34
|
extend Module.new(&metadata.extension) if metadata.extension?
|
35
35
|
end
|
36
36
|
|
37
37
|
protected
|
38
38
|
|
39
|
-
#
|
40
|
-
# the supplied code.
|
39
|
+
# Get the collection from the root of the hierarchy.
|
41
40
|
#
|
42
|
-
# @example
|
43
|
-
#
|
41
|
+
# @example Get the collection.
|
42
|
+
# relation.collection
|
44
43
|
#
|
45
|
-
# @
|
46
|
-
def building(&block)
|
47
|
-
@building = true
|
48
|
-
yield block if block_given?
|
49
|
-
@building = false
|
50
|
-
end
|
51
|
-
|
52
|
-
# Convenience method for determining if we are building an association.
|
53
|
-
# We never want to save in this case.
|
54
|
-
#
|
55
|
-
# @example Are we currently building?
|
56
|
-
# person.posts.building?
|
57
|
-
#
|
58
|
-
# @return [ true, false ] True if currently building, false if not.
|
44
|
+
# @return [ Collection ] The root's collection.
|
59
45
|
#
|
60
|
-
# @since 2.0.0
|
61
|
-
def
|
62
|
-
|
46
|
+
# @since 2.0.0
|
47
|
+
def collection
|
48
|
+
root = base._root
|
49
|
+
root.collection unless root.embedded?
|
63
50
|
end
|
64
51
|
|
65
52
|
# Return a new document for the type of class we want to instantiate.
|
@@ -123,6 +110,34 @@ module Mongoid # :nodoc:
|
|
123
110
|
def method_missing(name, *args, &block)
|
124
111
|
target.send(name, *args, &block)
|
125
112
|
end
|
113
|
+
|
114
|
+
# When the base document illegally references an embedded document this
|
115
|
+
# error will get raised.
|
116
|
+
#
|
117
|
+
# @example Raise the error.
|
118
|
+
# relation.raise_mixed
|
119
|
+
#
|
120
|
+
# @raise [ Errors::MixedRelations ] The error.
|
121
|
+
#
|
122
|
+
# @since 2.0.0
|
123
|
+
def raise_mixed
|
124
|
+
raise Errors::MixedRelations.new(base.class, metadata.klass)
|
125
|
+
end
|
126
|
+
|
127
|
+
# When the base is not yet saved and the user calls create or create!
|
128
|
+
# on the relation, this error will get raised.
|
129
|
+
#
|
130
|
+
# @example Raise the error.
|
131
|
+
# relation.raise_unsaved(post)
|
132
|
+
#
|
133
|
+
# @param [ Document ] doc The child document getting created.
|
134
|
+
#
|
135
|
+
# @raise [ Errors::UnsavedDocument ] The error.
|
136
|
+
#
|
137
|
+
# @since 2.0.0.rc.6
|
138
|
+
def raise_unsaved(doc)
|
139
|
+
raise Errors::UnsavedDocument.new(base, doc)
|
140
|
+
end
|
126
141
|
end
|
127
142
|
end
|
128
143
|
end
|
@@ -29,6 +29,9 @@ module Mongoid #:nodoc:
|
|
29
29
|
target.map(&:save) if base.persisted? && !options[:binding]
|
30
30
|
end
|
31
31
|
|
32
|
+
alias :concat :<<
|
33
|
+
alias :push :<<
|
34
|
+
|
32
35
|
# Clear the relation. Will delete the documents from the db if they are
|
33
36
|
# already persisted.
|
34
37
|
#
|
@@ -66,8 +69,8 @@ module Mongoid #:nodoc:
|
|
66
69
|
# @param [ Class ] type The optional type of document to create.
|
67
70
|
#
|
68
71
|
# @return [ Document ] The newly created document.
|
69
|
-
def create(attributes = nil, type = nil)
|
70
|
-
build(attributes, type).tap do |doc|
|
72
|
+
def create(attributes = nil, type = nil, &block)
|
73
|
+
build(attributes, type, &block).tap do |doc|
|
71
74
|
base.persisted? ? doc.save : raise_unsaved(doc)
|
72
75
|
end
|
73
76
|
end
|
@@ -85,8 +88,8 @@ module Mongoid #:nodoc:
|
|
85
88
|
# @raise [ Errors::Validations ] If validation failed.
|
86
89
|
#
|
87
90
|
# @return [ Document ] The newly created document.
|
88
|
-
def create!(attributes = nil, type = nil)
|
89
|
-
build(attributes, type).tap do |doc|
|
91
|
+
def create!(attributes = nil, type = nil, &block)
|
92
|
+
build(attributes, type, &block).tap do |doc|
|
90
93
|
base.persisted? ? doc.save! : raise_unsaved(doc)
|
91
94
|
end
|
92
95
|
end
|
@@ -104,10 +107,11 @@ module Mongoid #:nodoc:
|
|
104
107
|
#
|
105
108
|
# @return [ Integer ] The number of documents deleted.
|
106
109
|
def delete_all(conditions = nil)
|
110
|
+
raise_mixed if klass.embedded?
|
107
111
|
selector = (conditions || {})[:conditions] || {}
|
108
112
|
target.delete_if { |doc| doc.matches?(selector) }
|
109
113
|
metadata.klass.delete_all(
|
110
|
-
:conditions => selector.merge(
|
114
|
+
:conditions => criteria.selector.merge(selector)
|
111
115
|
)
|
112
116
|
end
|
113
117
|
|
@@ -124,10 +128,11 @@ module Mongoid #:nodoc:
|
|
124
128
|
#
|
125
129
|
# @return [ Integer ] The number of documents destroyd.
|
126
130
|
def destroy_all(conditions = nil)
|
131
|
+
raise_mixed if klass.embedded?
|
127
132
|
selector = (conditions || {})[:conditions] || {}
|
128
133
|
target.delete_if { |doc| doc.matches?(selector) }
|
129
134
|
metadata.klass.destroy_all(
|
130
|
-
:conditions => selector.merge(
|
135
|
+
:conditions => criteria.selector.merge(selector)
|
131
136
|
)
|
132
137
|
end
|
133
138
|
|
@@ -154,9 +159,8 @@ module Mongoid #:nodoc:
|
|
154
159
|
# @param [ Hash ] options The options to search with.
|
155
160
|
#
|
156
161
|
# @return [ Document, Criteria ] The matching document(s).
|
157
|
-
def find(
|
158
|
-
|
159
|
-
criteria.find(arg, :conditions => options[:conditions] || {})
|
162
|
+
def find(*args)
|
163
|
+
criteria.find(*args)
|
160
164
|
end
|
161
165
|
|
162
166
|
# Instantiate a new references_many relation. Will set the foreign key
|
@@ -182,6 +186,7 @@ module Mongoid #:nodoc:
|
|
182
186
|
#
|
183
187
|
# @since 2.0.0.rc.5
|
184
188
|
def load!(options = {})
|
189
|
+
raise_mixed if klass.embedded?
|
185
190
|
tap do |relation|
|
186
191
|
unless relation.loaded?
|
187
192
|
relation.target = target.entries
|
@@ -242,7 +247,7 @@ module Mongoid #:nodoc:
|
|
242
247
|
# @since 2.0.0.rc.1
|
243
248
|
def unbind(options = {})
|
244
249
|
binding.unbind(options)
|
245
|
-
|
250
|
+
unless base.new_record?
|
246
251
|
target.each(&:delete) unless options[:binding]
|
247
252
|
target.each(&:save) if options[:nullify]
|
248
253
|
end
|
@@ -261,7 +266,8 @@ module Mongoid #:nodoc:
|
|
261
266
|
#
|
262
267
|
# @since 2.0.0.rc.1
|
263
268
|
def append(document, options = {})
|
264
|
-
|
269
|
+
init_target if !initialized? && !loaded?
|
270
|
+
target.push(document)
|
265
271
|
characterize_one(document)
|
266
272
|
binding.bind_one(document, options)
|
267
273
|
end
|
@@ -288,9 +294,39 @@ module Mongoid #:nodoc:
|
|
288
294
|
#
|
289
295
|
# @return [ Criteria ] A new criteria.
|
290
296
|
def criteria
|
297
|
+
raise_mixed if klass.embedded?
|
291
298
|
metadata.klass.where(metadata.foreign_key => base.id)
|
292
299
|
end
|
293
300
|
|
301
|
+
# Tells if the target array been initialized.
|
302
|
+
#
|
303
|
+
# @example Is the target initialized?
|
304
|
+
# relation.initialized?
|
305
|
+
#
|
306
|
+
# @return [ true, false ] If the target is an array.
|
307
|
+
#
|
308
|
+
# @since 2.0.0
|
309
|
+
def initialized?
|
310
|
+
!!@initialized
|
311
|
+
end
|
312
|
+
|
313
|
+
# Initializes the target of the proxy as an empty array instead of
|
314
|
+
# hitting the database.
|
315
|
+
#
|
316
|
+
# @example Initialize the target.
|
317
|
+
# relation.init_target
|
318
|
+
#
|
319
|
+
# @raise [ Errors::MixedRelations ] If the class is embedded.
|
320
|
+
#
|
321
|
+
# @return [ true ] Always true.
|
322
|
+
#
|
323
|
+
# @since 2.0.0
|
324
|
+
def init_target
|
325
|
+
raise_mixed if klass.embedded?
|
326
|
+
@target = []
|
327
|
+
@initialized = true
|
328
|
+
end
|
329
|
+
|
294
330
|
# If the target array does not respond to the supplied method then try to
|
295
331
|
# find a named scope or criteria on the class and send the call there.
|
296
332
|
#
|
@@ -309,21 +345,6 @@ module Mongoid #:nodoc:
|
|
309
345
|
end
|
310
346
|
end
|
311
347
|
|
312
|
-
# When the base is not yet saved and the user calls create or create!
|
313
|
-
# on the relation, this error will get raised.
|
314
|
-
#
|
315
|
-
# @example Raise the error.
|
316
|
-
# relation.raise_unsaved(post)
|
317
|
-
#
|
318
|
-
# @param [ Document ] doc The child document getting created.
|
319
|
-
#
|
320
|
-
# @raise [ Errors::UnsavedDocument ] The error.
|
321
|
-
#
|
322
|
-
# @since 2.0.0.rc.6
|
323
|
-
def raise_unsaved(doc)
|
324
|
-
raise Errors::UnsavedDocument.new(base, doc)
|
325
|
-
end
|
326
|
-
|
327
348
|
class << self
|
328
349
|
|
329
350
|
# Return the builder that is responsible for generating the documents
|
@@ -17,14 +17,22 @@ module Mongoid # :nodoc:
|
|
17
17
|
# person.addresses.push(address)
|
18
18
|
#
|
19
19
|
# @example Concat with other documents.
|
20
|
-
#
|
20
|
+
# person.addresses.concat([ address_one, address_two ])
|
21
21
|
#
|
22
22
|
# @param [ Document, Array<Document> ] *args Any number of documents.
|
23
23
|
def <<(*args)
|
24
24
|
options = default_options(args)
|
25
|
-
|
26
|
-
|
25
|
+
args.flatten.each do |doc|
|
26
|
+
return doc unless doc
|
27
|
+
append(doc, options)
|
28
|
+
if base.persisted? && !options[:binding]
|
29
|
+
doc.save
|
30
|
+
base.add_to_set(metadata.foreign_key, doc.id)
|
31
|
+
end
|
32
|
+
end
|
27
33
|
end
|
34
|
+
alias :concat :<<
|
35
|
+
alias :push :<<
|
28
36
|
|
29
37
|
# Creates a new document on the references many relation. This will
|
30
38
|
# save the document if the parent has been persisted.
|
@@ -38,7 +46,10 @@ module Mongoid # :nodoc:
|
|
38
46
|
# @return [ Document ] The newly created document.
|
39
47
|
def create(attributes = nil, type = nil)
|
40
48
|
build(attributes, type).tap do |doc|
|
41
|
-
|
49
|
+
if base.persisted?
|
50
|
+
doc.save
|
51
|
+
base.add_to_set(metadata.foreign_key, doc.id)
|
52
|
+
end
|
42
53
|
end
|
43
54
|
end
|
44
55
|
|
@@ -57,7 +68,10 @@ module Mongoid # :nodoc:
|
|
57
68
|
# @return [ Document ] The newly created document.
|
58
69
|
def create!(attributes = nil, type = nil)
|
59
70
|
build(attributes, type).tap do |doc|
|
60
|
-
|
71
|
+
if base.persisted?
|
72
|
+
doc.save!
|
73
|
+
base.add_to_set(metadata.foreign_key, doc.id)
|
74
|
+
end
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
@@ -88,10 +102,7 @@ module Mongoid # :nodoc:
|
|
88
102
|
#
|
89
103
|
# @return [ Integer ] The number of documents deleted.
|
90
104
|
def delete_all(conditions = nil)
|
91
|
-
|
92
|
-
target.delete_if { |doc| doc.matches?(selector) }
|
93
|
-
scoping = { :_id => { "$in" => base.send(metadata.foreign_key) } }
|
94
|
-
metadata.klass.delete_all(:conditions => selector.merge(scoping))
|
105
|
+
remove_all(conditions, :delete_all)
|
95
106
|
end
|
96
107
|
|
97
108
|
# Destroys all related documents from the database given the supplied
|
@@ -107,10 +118,7 @@ module Mongoid # :nodoc:
|
|
107
118
|
#
|
108
119
|
# @return [ Integer ] The number of documents destroyd.
|
109
120
|
def destroy_all(conditions = nil)
|
110
|
-
|
111
|
-
target.delete_if { |doc| doc.matches?(selector) }
|
112
|
-
scoping = { :_id => { "$in" => base.send(metadata.foreign_key) } }
|
113
|
-
metadata.klass.destroy_all(:conditions => selector.merge(scoping))
|
121
|
+
remove_all(conditions, :destroy_all)
|
114
122
|
end
|
115
123
|
|
116
124
|
# Removes all associations between the base document and the target
|
@@ -204,7 +212,11 @@ module Mongoid # :nodoc:
|
|
204
212
|
#
|
205
213
|
# @return [ Criteria ] A new criteria.
|
206
214
|
def criteria
|
207
|
-
metadata.
|
215
|
+
if metadata.inverse
|
216
|
+
metadata.klass.any_in(metadata.inverse_foreign_key => [ base.id ])
|
217
|
+
else
|
218
|
+
metadata.klass.where(:_id => { "$in" => base.send(metadata.foreign_key) })
|
219
|
+
end
|
208
220
|
end
|
209
221
|
|
210
222
|
# Dereferences the supplied document from the base of the relation.
|
@@ -219,6 +231,27 @@ module Mongoid # :nodoc:
|
|
219
231
|
document.save
|
220
232
|
end
|
221
233
|
|
234
|
+
# Remove all documents from the relation, either with a delete or a
|
235
|
+
# destroy depending on what this was called through.
|
236
|
+
#
|
237
|
+
# @example Destroy documents from the relation.
|
238
|
+
# relation.remove_all(:conditions => { :num => 1 }, true)
|
239
|
+
#
|
240
|
+
# @param [ Hash ] conditions Conditions to filter by.
|
241
|
+
# @param [ true, false ] destroy If true then destroy, else delete.
|
242
|
+
#
|
243
|
+
# @return [ Integer ] The number of documents removed.
|
244
|
+
def remove_all(conditions = {}, method = :destroy)
|
245
|
+
cond = conditions || {}
|
246
|
+
target.delete_if do |doc|
|
247
|
+
doc.matches?(cond[:conditions] || {})
|
248
|
+
end
|
249
|
+
ids = criteria.merge(cond).only(:_id).map(&:_id)
|
250
|
+
criteria.merge(cond).send(method).tap do
|
251
|
+
base.pull_all(metadata.foreign_key, ids)
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
222
255
|
class << self
|
223
256
|
|
224
257
|
# Return the builder that is responsible for generating the documents
|
@@ -44,6 +44,20 @@ module Mongoid # :nodoc:
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
+
# Will load the target into an array if the target had not already been
|
48
|
+
# loaded.
|
49
|
+
#
|
50
|
+
# @example Load the relation into memory.
|
51
|
+
# relation.load!
|
52
|
+
#
|
53
|
+
# @return [ One ] The relation.
|
54
|
+
#
|
55
|
+
# @since 2.0.0.rc.5
|
56
|
+
def load!(options = {})
|
57
|
+
raise_mixed if klass.embedded?
|
58
|
+
super(options)
|
59
|
+
end
|
60
|
+
|
47
61
|
# Removes the association between the base document and the target
|
48
62
|
# document by deleting the foreign key and the reference, orphaning
|
49
63
|
# the target document in the process.
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid #:nodoc
|
3
|
+
|
4
|
+
# This module contains behaviour for adding shard key fields to updates.
|
5
|
+
module Sharding
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
cattr_accessor :shard_key_fields
|
10
|
+
self.shard_key_fields = []
|
11
|
+
|
12
|
+
delegate :shard_key_fields, :to => "self.class"
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get the document selector with the defined shard keys.
|
16
|
+
#
|
17
|
+
# @example Get the selector for the shard keys.
|
18
|
+
# person.shard_key_selector
|
19
|
+
#
|
20
|
+
# @return [ Hash ] The shard key selector.
|
21
|
+
#
|
22
|
+
# @since 2.0.0
|
23
|
+
def shard_key_selector
|
24
|
+
{}.tap do |selector|
|
25
|
+
shard_key_fields.each do |field|
|
26
|
+
selector[field.to_s] = send(field)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods #:nodoc
|
32
|
+
|
33
|
+
# Specifies a shard key with the field(s) specified.
|
34
|
+
#
|
35
|
+
# @example Specify the shard key.
|
36
|
+
#
|
37
|
+
# class Person
|
38
|
+
# include Mongoid::Document
|
39
|
+
# field :first_name, :type => String
|
40
|
+
# field :last_name, :type => String
|
41
|
+
#
|
42
|
+
# shard_key :first_name, :last_name
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# @since 2.0.0
|
46
|
+
def shard_key(*names)
|
47
|
+
self.shard_key_fields = names
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|