mongoid 7.4.0 → 8.0.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +3 -3
- data/lib/config/locales/en.yml +51 -28
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +48 -8
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +22 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +2 -1
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -14
- data/lib/mongoid/association/referenced/has_many/proxy.rb +12 -9
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config/environment.rb +20 -4
- data/lib/mongoid/config.rb +25 -10
- data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +176 -17
- data/lib/mongoid/contextual/mongo.rb +226 -206
- data/lib/mongoid/contextual/none.rb +66 -4
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -13
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -14
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +21 -0
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +28 -34
- data/lib/mongoid/criteria/queryable/selector.rb +89 -4
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -26
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +96 -32
- data/lib/mongoid/errors/document_not_found.rb +29 -8
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +12 -5
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +194 -28
- data/lib/mongoid/findable.rb +27 -7
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistence_context.rb +19 -2
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +5 -1
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +28 -0
- data/lib/mongoid.rb +2 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +11 -5
- data/spec/config/mongoid.yml +16 -0
- data/spec/config/mongoid_with_schema_map_uuid.yml +27 -0
- data/spec/integration/app_spec.rb +28 -26
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_dirty_spec.rb +28 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/lite_spec_helper.rb +1 -1
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +219 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +157 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +67 -4
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +8 -8
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +82 -13
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/atomic_spec.rb +22 -0
- data/spec/mongoid/attributes/nested_spec.rb +80 -11
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +524 -27
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +34 -42
- data/spec/mongoid/clients/options_spec.rb +1 -0
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config/environment_spec.rb +39 -1
- data/spec/mongoid/config_spec.rb +104 -13
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +396 -158
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +1337 -69
- data/spec/mongoid/contextual/mongo_spec.rb +1105 -172
- data/spec/mongoid/contextual/none_spec.rb +38 -0
- data/spec/mongoid/copyable_spec.rb +451 -1
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +289 -124
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +474 -1198
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/errors/document_not_found_spec.rb +76 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -0
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +80 -15
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +50 -1
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +0 -154
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +21 -1
- data/spec/mongoid/shardable_spec.rb +14 -0
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/constraints.rb +8 -16
- data/spec/shared/lib/mrss/docker_runner.rb +23 -3
- data/spec/shared/lib/mrss/eg_config_utils.rb +51 -0
- data/spec/shared/lib/mrss/lite_constraints.rb +32 -1
- data/spec/shared/share/Dockerfile.erb +34 -48
- data/spec/shared/shlib/config.sh +27 -0
- data/spec/shared/shlib/server.sh +32 -19
- data/spec/shared/shlib/set_env.sh +37 -0
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +39 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/code.rb +2 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/membership.rb +1 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data/spec/support/schema_maps/schema_map_aws.json +17 -0
- data/spec/support/schema_maps/schema_map_aws_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_azure.json +17 -0
- data/spec/support/schema_maps/schema_map_azure_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_gcp.json +17 -0
- data/spec/support/schema_maps/schema_map_gcp_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_kmip.json +17 -0
- data/spec/support/schema_maps/schema_map_kmip_key_alt_names.json +12 -0
- data/spec/support/schema_maps/schema_map_local.json +18 -0
- data/spec/support/schema_maps/schema_map_local_key_alt_names.json +12 -0
- data/spec/support/spec_config.rb +4 -0
- data.tar.gz.sig +0 -0
- metadata +76 -13
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
@@ -154,7 +154,7 @@ module Mongoid
|
|
154
154
|
raise Errors::CriteriaArgumentRequired, :elem_match
|
155
155
|
end
|
156
156
|
|
157
|
-
|
157
|
+
and_or_override(criterion, "$elemMatch")
|
158
158
|
end
|
159
159
|
key :elem_match, :override, "$elemMatch"
|
160
160
|
|
@@ -227,19 +227,6 @@ module Mongoid
|
|
227
227
|
__merge__(criterion)
|
228
228
|
end
|
229
229
|
|
230
|
-
# Alias for +geo_spatial+.
|
231
|
-
#
|
232
|
-
# @deprecated
|
233
|
-
def geo_spacial(criterion)
|
234
|
-
# Duplicate method body so that we can raise this exception with
|
235
|
-
# geo_spacial as the indicated operator rather than geo_spatial.
|
236
|
-
if criterion.nil?
|
237
|
-
raise Errors::CriteriaArgumentRequired, :geo_spacial
|
238
|
-
end
|
239
|
-
|
240
|
-
__merge__(criterion)
|
241
|
-
end
|
242
|
-
|
243
230
|
key :intersects_line, :override, "$geoIntersects", "$geometry" do |value|
|
244
231
|
{ "type" => LINE_STRING, "coordinates" => value }
|
245
232
|
end
|
@@ -270,7 +257,7 @@ module Mongoid
|
|
270
257
|
raise Errors::CriteriaArgumentRequired, :eq
|
271
258
|
end
|
272
259
|
|
273
|
-
|
260
|
+
and_or_override(criterion, "$eq")
|
274
261
|
end
|
275
262
|
key :eq, :override, "$eq"
|
276
263
|
|
@@ -290,7 +277,7 @@ module Mongoid
|
|
290
277
|
raise Errors::CriteriaArgumentRequired, :gt
|
291
278
|
end
|
292
279
|
|
293
|
-
|
280
|
+
and_or_override(criterion, "$gt")
|
294
281
|
end
|
295
282
|
key :gt, :override, "$gt"
|
296
283
|
|
@@ -310,7 +297,7 @@ module Mongoid
|
|
310
297
|
raise Errors::CriteriaArgumentRequired, :gte
|
311
298
|
end
|
312
299
|
|
313
|
-
|
300
|
+
and_or_override(criterion, "$gte")
|
314
301
|
end
|
315
302
|
key :gte, :override, "$gte"
|
316
303
|
|
@@ -366,7 +353,7 @@ module Mongoid
|
|
366
353
|
raise Errors::CriteriaArgumentRequired, :lt
|
367
354
|
end
|
368
355
|
|
369
|
-
|
356
|
+
and_or_override(criterion, "$lt")
|
370
357
|
end
|
371
358
|
key :lt, :override, "$lt"
|
372
359
|
|
@@ -386,7 +373,7 @@ module Mongoid
|
|
386
373
|
raise Errors::CriteriaArgumentRequired, :lte
|
387
374
|
end
|
388
375
|
|
389
|
-
|
376
|
+
and_or_override(criterion, "$lte")
|
390
377
|
end
|
391
378
|
key :lte, :override, "$lte"
|
392
379
|
|
@@ -423,7 +410,7 @@ module Mongoid
|
|
423
410
|
raise Errors::CriteriaArgumentRequired, :mod
|
424
411
|
end
|
425
412
|
|
426
|
-
|
413
|
+
and_or_override(criterion, "$mod")
|
427
414
|
end
|
428
415
|
key :mod, :override, "$mod"
|
429
416
|
|
@@ -443,7 +430,7 @@ module Mongoid
|
|
443
430
|
raise Errors::CriteriaArgumentRequired, :ne
|
444
431
|
end
|
445
432
|
|
446
|
-
|
433
|
+
and_or_override(criterion, "$ne")
|
447
434
|
end
|
448
435
|
alias :excludes :ne
|
449
436
|
key :ne, :override, "$ne"
|
@@ -464,7 +451,7 @@ module Mongoid
|
|
464
451
|
raise Errors::CriteriaArgumentRequired, :near
|
465
452
|
end
|
466
453
|
|
467
|
-
|
454
|
+
and_or_override(criterion, "$near")
|
468
455
|
end
|
469
456
|
key :near, :override, "$near"
|
470
457
|
|
@@ -484,7 +471,7 @@ module Mongoid
|
|
484
471
|
raise Errors::CriteriaArgumentRequired, :near_sphere
|
485
472
|
end
|
486
473
|
|
487
|
-
|
474
|
+
and_or_override(criterion, "$nearSphere")
|
488
475
|
end
|
489
476
|
key :near_sphere, :override, "$nearSphere"
|
490
477
|
|
@@ -679,16 +666,7 @@ module Mongoid
|
|
679
666
|
end]
|
680
667
|
end
|
681
668
|
end
|
682
|
-
|
683
|
-
#where('$or' => exprs)
|
684
|
-
# But since that is broken do instead:
|
685
|
-
clone.tap do |query|
|
686
|
-
if query.selector['$or']
|
687
|
-
query.selector.store('$or', query.selector['$or'] + exprs)
|
688
|
-
else
|
689
|
-
query.selector.store('$or', exprs)
|
690
|
-
end
|
691
|
-
end
|
669
|
+
self.and('$or' => exprs)
|
692
670
|
end
|
693
671
|
end
|
694
672
|
|
@@ -874,7 +852,7 @@ module Mongoid
|
|
874
852
|
# @param [ Hash ] criterion The criterion.
|
875
853
|
def typed_override(criterion, operator)
|
876
854
|
if criterion
|
877
|
-
criterion.
|
855
|
+
criterion.transform_values! do |value|
|
878
856
|
yield(value)
|
879
857
|
end
|
880
858
|
end
|
@@ -924,6 +902,22 @@ module Mongoid
|
|
924
902
|
end
|
925
903
|
end
|
926
904
|
|
905
|
+
# Combine operator expessions onto a Criteria using either
|
906
|
+
# an override or ands depending on the status of the
|
907
|
+
# Mongoid.overwrite_chained_operators feature flag.
|
908
|
+
#
|
909
|
+
# @param [ Hash ] The criterion to add to the criteria.
|
910
|
+
# @param [ String ] operator The MongoDB operator.
|
911
|
+
#
|
912
|
+
# @return [ Criteria ] The resulting criteria.
|
913
|
+
def and_or_override(criterion, operator)
|
914
|
+
if Mongoid.overwrite_chained_operators
|
915
|
+
__override__(criterion, operator)
|
916
|
+
else
|
917
|
+
and_with_operator(criterion, operator)
|
918
|
+
end
|
919
|
+
end
|
920
|
+
|
927
921
|
class << self
|
928
922
|
|
929
923
|
# Get the methods on the selectable that can be forwarded to from a model.
|
@@ -53,8 +53,7 @@ module Mongoid
|
|
53
53
|
store_name = name
|
54
54
|
store_value = evolve_multi(value)
|
55
55
|
else
|
56
|
-
store_name =
|
57
|
-
store_value = evolve(serializer, value)
|
56
|
+
store_name, store_value = store_creds(name, serializer, value)
|
58
57
|
end
|
59
58
|
super(store_name, store_value)
|
60
59
|
end
|
@@ -74,6 +73,24 @@ module Mongoid
|
|
74
73
|
|
75
74
|
private
|
76
75
|
|
76
|
+
# Get the store name and store value. If the value is of type range,
|
77
|
+
# we need may need to change the store_name as well as the store_value,
|
78
|
+
# therefore, we cannot just use the evole method.
|
79
|
+
#
|
80
|
+
# @param [ String ] name The name of the field.
|
81
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
82
|
+
# @param [ Object ] value The value to serialize.
|
83
|
+
#
|
84
|
+
# @return [ Array<String, String> ] The store name and store value.
|
85
|
+
def store_creds(name, serializer, value)
|
86
|
+
store_name = localized_key(name, serializer)
|
87
|
+
if Range === value
|
88
|
+
evolve_range(store_name, serializer, value)
|
89
|
+
else
|
90
|
+
[ store_name, evolve(serializer, value) ]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
77
94
|
# Evolves a multi-list selection, like an $and or $or criterion, and
|
78
95
|
# performs the necessary serialization.
|
79
96
|
#
|
@@ -103,11 +120,10 @@ module Mongoid
|
|
103
120
|
# some reason, although per its documentation Smash supposedly
|
104
121
|
# owns both.
|
105
122
|
name, serializer = storage_pair(key)
|
106
|
-
final_key = localized_key(name, serializer)
|
107
123
|
# This performs type conversions on the value and transformations
|
108
124
|
# that depend on the type of the field that the value is stored
|
109
125
|
# in, but not transformations that have to do with query shape.
|
110
|
-
evolved_value =
|
126
|
+
final_key, evolved_value = store_creds(name, serializer, value)
|
111
127
|
|
112
128
|
# This builds a query shape around the value, when the query
|
113
129
|
# involves complex keys. For example, {:foo.lt => 5} produces
|
@@ -139,6 +155,8 @@ module Mongoid
|
|
139
155
|
evolve_hash(serializer, value)
|
140
156
|
when Array
|
141
157
|
evolve_array(serializer, value)
|
158
|
+
when Range
|
159
|
+
value.__evolve_range__(serializer: serializer)
|
142
160
|
else
|
143
161
|
(serializer || value.class).evolve(value)
|
144
162
|
end
|
@@ -182,6 +200,73 @@ module Mongoid
|
|
182
200
|
end
|
183
201
|
end
|
184
202
|
|
203
|
+
# Evolve a single key selection with range values. This method traverses
|
204
|
+
# the association tree to build a query for the given value and
|
205
|
+
# serializer. There are three parts to the query here:
|
206
|
+
#
|
207
|
+
# (1) "klass.child.gchild" => {
|
208
|
+
# "$elemMatch" => {
|
209
|
+
# (2) "ggchild.field" => (3) { "$gte" => 6, "$lte" => 10 }
|
210
|
+
# }
|
211
|
+
# }
|
212
|
+
# (1) The first n fields are dotted together until the last
|
213
|
+
# embeds_many or field of type array. In the above case, gchild
|
214
|
+
# would be an embeds_many or Array, and ggchild would be an
|
215
|
+
# embeds_one or a hash.
|
216
|
+
# (2) The last fields are used inside the $elemMatch. This one is
|
217
|
+
# actually optional, and will be ignored if the last field is an
|
218
|
+
# array or embeds_many. If the last field is an array (1), (2) and
|
219
|
+
# (3) will look like:
|
220
|
+
#
|
221
|
+
# "klass.child.gchild.ggchild.field" => {
|
222
|
+
# { "$elemMatch" => { "$gte" => 6, "$lte" => 10 } }
|
223
|
+
# }
|
224
|
+
#
|
225
|
+
# (3) This is calculated by:
|
226
|
+
#
|
227
|
+
# value.__evolve_range__(serializer: serializer).
|
228
|
+
#
|
229
|
+
# @api private
|
230
|
+
#
|
231
|
+
# @param [ String ] key The to store the range for.
|
232
|
+
# @param [ Object ] serializer The optional serializer for the field.
|
233
|
+
# @param [ Range ] value The Range to serialize.
|
234
|
+
#
|
235
|
+
# @return [ Array<String, Hash> ] The store name and serialized Range.
|
236
|
+
def evolve_range(key, serializer, value)
|
237
|
+
v = value.__evolve_range__(serializer: serializer)
|
238
|
+
assocs = []
|
239
|
+
Fields.traverse_association_tree(key, serializers, associations, aliased_associations) do |meth, obj, is_field|
|
240
|
+
assocs.push([meth, obj, is_field])
|
241
|
+
end
|
242
|
+
|
243
|
+
# Iterate backwards until you get a field with type
|
244
|
+
# Array or an embeds_many association.
|
245
|
+
inner_key = ""
|
246
|
+
loop do
|
247
|
+
# If there are no arrays or embeds_many associations, just return
|
248
|
+
# the key and value without $elemMatch.
|
249
|
+
return [ key, v ] if assocs.empty?
|
250
|
+
|
251
|
+
meth, obj, is_field = assocs.last
|
252
|
+
break if (is_field && obj.type == Array) || (!is_field && obj.is_a?(Association::Embedded::EmbedsMany))
|
253
|
+
|
254
|
+
assocs.pop
|
255
|
+
inner_key = "#{meth}.#{inner_key}"
|
256
|
+
end
|
257
|
+
|
258
|
+
# If the last array or embeds_many association is the last field,
|
259
|
+
# the inner key (2) is ignored, and the outer key (1) is the original
|
260
|
+
# key.
|
261
|
+
if inner_key.blank?
|
262
|
+
[ key, { "$elemMatch" => v }]
|
263
|
+
else
|
264
|
+
store_key = assocs.map(&:first).join('.')
|
265
|
+
store_value = { "$elemMatch" => { inner_key.chop => v } }
|
266
|
+
[ store_key, store_value ]
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
185
270
|
# Determines if the selection is a multi-select, like an $and or $or or $nor
|
186
271
|
# selection.
|
187
272
|
#
|
@@ -8,8 +8,16 @@ module Mongoid
|
|
8
8
|
class Smash < Hash
|
9
9
|
|
10
10
|
# @attribute [r] aliases The aliases.
|
11
|
+
attr_reader :aliases
|
12
|
+
|
11
13
|
# @attribute [r] serializers The serializers.
|
12
|
-
attr_reader :
|
14
|
+
attr_reader :serializers
|
15
|
+
|
16
|
+
# @attribute [r] associations The associations.
|
17
|
+
attr_reader :associations
|
18
|
+
|
19
|
+
# @attribute [r] aliased_associations The aliased_associations.
|
20
|
+
attr_reader :aliased_associations
|
13
21
|
|
14
22
|
# Perform a deep copy of the smash.
|
15
23
|
#
|
@@ -18,7 +26,7 @@ module Mongoid
|
|
18
26
|
#
|
19
27
|
# @return [ Smash ] The copied hash.
|
20
28
|
def __deep_copy__
|
21
|
-
self.class.new(aliases, serializers) do |copy|
|
29
|
+
self.class.new(aliases, serializers, associations, aliased_associations) do |copy|
|
22
30
|
each_pair do |key, value|
|
23
31
|
copy.store(key, value.__deep_copy__)
|
24
32
|
end
|
@@ -36,8 +44,15 @@ module Mongoid
|
|
36
44
|
# responsible for serializing values. The keys of the hash must be
|
37
45
|
# strings that match the field name, and the values must respond to
|
38
46
|
# #localized? and #evolve(object).
|
39
|
-
|
40
|
-
|
47
|
+
# @param [ Hash ] associations An optional hash of names to association
|
48
|
+
# objects.
|
49
|
+
# @param [ Hash ] aliased_associations An optional hash of mappings from
|
50
|
+
# aliases for associations to their actual field names in the database.
|
51
|
+
def initialize(aliases = {}, serializers = {}, associations = {}, aliased_associations = {})
|
52
|
+
@aliases = aliases
|
53
|
+
@serializers = serializers
|
54
|
+
@associations = associations
|
55
|
+
@aliased_associations = aliased_associations
|
41
56
|
yield(self) if block_given?
|
42
57
|
end
|
43
58
|
|
@@ -86,8 +101,26 @@ module Mongoid
|
|
86
101
|
# serializer.
|
87
102
|
def storage_pair(key)
|
88
103
|
field = key.to_s
|
89
|
-
name =
|
90
|
-
[ name,
|
104
|
+
name = Fields.database_field_name(field, associations, aliases, aliased_associations)
|
105
|
+
[ name, get_serializer(name) ]
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
# Retrieves the serializer for the given name. If the name exists in
|
111
|
+
# the serializers hash then return that immediately, otherwise
|
112
|
+
# recursively look through the associations and find the appropriate
|
113
|
+
# field.
|
114
|
+
#
|
115
|
+
# @param [ String ] name The name of the db field.
|
116
|
+
#
|
117
|
+
# @return [ Object ] The serializer.
|
118
|
+
def get_serializer(name)
|
119
|
+
if s = serializers[name]
|
120
|
+
s
|
121
|
+
else
|
122
|
+
Fields.traverse_association_tree(name, serializers, associations, aliased_associations)
|
123
|
+
end
|
91
124
|
end
|
92
125
|
end
|
93
126
|
end
|
@@ -33,9 +33,10 @@ module Mongoid
|
|
33
33
|
include Optional
|
34
34
|
|
35
35
|
# @attribute [r] aliases The aliases.
|
36
|
-
|
36
|
+
attr_reader :aliases
|
37
|
+
|
37
38
|
# @attribute [r] serializers The serializers.
|
38
|
-
attr_reader :
|
39
|
+
attr_reader :serializers
|
39
40
|
|
40
41
|
# Is this queryable equal to another object? Is true if the selector and
|
41
42
|
# options are equal.
|
@@ -59,11 +60,15 @@ module Mongoid
|
|
59
60
|
#
|
60
61
|
# @param [ Hash ] aliases The optional field aliases.
|
61
62
|
# @param [ Hash ] serializers The optional field serializers.
|
63
|
+
# @param [ Hash ] associations The optional associations.
|
64
|
+
# @param [ Hash ] aliased_associations The optional aliased associations.
|
62
65
|
# @param [ Symbol ] driver The driver being used.
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
@
|
66
|
+
#
|
67
|
+
# @api private
|
68
|
+
def initialize(aliases = {}, serializers = {}, associations = {}, aliased_associations = {})
|
69
|
+
@aliases, @serializers = aliases, serializers
|
70
|
+
@options = Options.new(aliases, serializers, associations, aliased_associations)
|
71
|
+
@selector = Selector.new(aliases, serializers, associations, aliased_associations)
|
67
72
|
@pipeline = Pipeline.new(aliases)
|
68
73
|
@aggregating = nil
|
69
74
|
yield(self) if block_given?
|
data/lib/mongoid/criteria.rb
CHANGED
@@ -112,31 +112,6 @@ module Mongoid
|
|
112
112
|
entries.as_json(options)
|
113
113
|
end
|
114
114
|
|
115
|
-
# Tells the criteria that the cursor that gets returned needs to be
|
116
|
-
# cached. This is so multiple iterations don't hit the database multiple
|
117
|
-
# times, however this is not advisable when working with large data sets
|
118
|
-
# as the entire results will get stored in memory.
|
119
|
-
#
|
120
|
-
# @example Flag the criteria as cached.
|
121
|
-
# criteria.cache
|
122
|
-
#
|
123
|
-
# @return [ Criteria ] The cloned criteria.
|
124
|
-
def cache
|
125
|
-
crit = clone
|
126
|
-
crit.options.merge!(cache: true)
|
127
|
-
crit
|
128
|
-
end
|
129
|
-
|
130
|
-
# Will return true if the cache option has been set.
|
131
|
-
#
|
132
|
-
# @example Is the criteria cached?
|
133
|
-
# criteria.cached?
|
134
|
-
#
|
135
|
-
# @return [ true, false ] If the criteria is flagged as cached.
|
136
|
-
def cached?
|
137
|
-
options[:cache] == true
|
138
|
-
end
|
139
|
-
|
140
115
|
# Get the documents from the embedded criteria.
|
141
116
|
#
|
142
117
|
# @example Get the documents.
|
@@ -230,7 +205,7 @@ module Mongoid
|
|
230
205
|
@klass = klass
|
231
206
|
@embedded = nil
|
232
207
|
@none = nil
|
233
|
-
klass ? super(klass.aliased_fields, klass.fields) : super({}, {})
|
208
|
+
klass ? super(klass.aliased_fields, klass.fields, klass.relations, klass.aliased_associations) : super({}, {}, {}, {})
|
234
209
|
end
|
235
210
|
|
236
211
|
# Merges another object with this +Criteria+ and returns a new criteria.
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "mongoid/deprecation"
|
4
|
+
|
5
|
+
module Mongoid
|
6
|
+
|
7
|
+
# Adds ability to declare Mongoid-specific deprecations.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
module Deprecable
|
11
|
+
|
12
|
+
# Declares method(s) as deprecated.
|
13
|
+
#
|
14
|
+
# @example Deprecate a method.
|
15
|
+
# Mongoid.deprecate(Cat, :meow); Cat.new.meow
|
16
|
+
# #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0")
|
17
|
+
#
|
18
|
+
# @example Deprecate a method and declare the replacement method.
|
19
|
+
# Mongoid.deprecate(Cat, meow: :speak); Cat.new.meow
|
20
|
+
# #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0 (use speak instead)")
|
21
|
+
#
|
22
|
+
# @example Deprecate a method and give replacement instructions.
|
23
|
+
# Mongoid.deprecate(Cat, meow: 'eat :catnip instead'); Cat.new.meow
|
24
|
+
# #=> Mongoid.logger.warn("meow is deprecated and will be removed from Mongoid 8.0 (eat :catnip instead)")
|
25
|
+
#
|
26
|
+
# @param [ Module ] target_module The parent which contains the method.
|
27
|
+
# @param [ Symbol | Hash<Symbol, [Symbol|String]> ] method_descriptors
|
28
|
+
# The methods to deprecate, with optional replacement instructions.
|
29
|
+
def deprecate(target_module, *method_descriptors)
|
30
|
+
Mongoid::Deprecation.deprecate_methods(target_module, *method_descriptors)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Ensure Mongoid.deprecate can be used during initialization
|
36
|
+
Mongoid.extend(Mongoid::Deprecable)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mongoid
|
4
|
+
|
5
|
+
# Utility class for logging deprecation warnings.
|
6
|
+
class Deprecation < ::ActiveSupport::Deprecation
|
7
|
+
|
8
|
+
@gem_name = 'Mongoid'
|
9
|
+
|
10
|
+
# Per change policy, deprecations will be removed in the next major version.
|
11
|
+
@deprecation_horizon = "#{Mongoid::VERSION.split('.').first.to_i + 1}.0".freeze
|
12
|
+
|
13
|
+
# Overrides default ActiveSupport::Deprecation behavior
|
14
|
+
# to use Mongoid's logger.
|
15
|
+
#
|
16
|
+
# @return Array<Proc> The deprecation behavior.
|
17
|
+
def behavior
|
18
|
+
@behavior ||= Array(->(message, callstack, _deprecation_horizon, _gem_name) {
|
19
|
+
logger = Mongoid.logger
|
20
|
+
logger.warn(message)
|
21
|
+
logger.debug(callstack.join("\n ")) if debug
|
22
|
+
})
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/mongoid/document.rb
CHANGED
@@ -100,21 +100,8 @@ module Mongoid
|
|
100
100
|
# @param [ Hash ] attrs The attributes to set up the document with.
|
101
101
|
#
|
102
102
|
# @return [ Document ] A new document.
|
103
|
-
def initialize(attrs = nil)
|
104
|
-
|
105
|
-
_building do
|
106
|
-
@new_record = true
|
107
|
-
@attributes ||= {}
|
108
|
-
apply_pre_processed_defaults
|
109
|
-
apply_default_scoping
|
110
|
-
process_attributes(attrs) do
|
111
|
-
yield(self) if block_given?
|
112
|
-
end
|
113
|
-
apply_post_processed_defaults
|
114
|
-
# @todo: #2586: Need to have access to parent document in these
|
115
|
-
# callbacks.
|
116
|
-
run_callbacks(:initialize) unless _initialize_callbacks.empty?
|
117
|
-
end
|
103
|
+
def initialize(attrs = nil, &block)
|
104
|
+
construct_document(attrs, execute_callbacks: true, &block)
|
118
105
|
end
|
119
106
|
|
120
107
|
# Return the model name of the document.
|
@@ -137,16 +124,6 @@ module Mongoid
|
|
137
124
|
(persisted? || destroyed?) ? [ _id.to_s ] : nil
|
138
125
|
end
|
139
126
|
|
140
|
-
# Return an array with this +Document+ only in it.
|
141
|
-
#
|
142
|
-
# @example Return the document in an array.
|
143
|
-
# document.to_a
|
144
|
-
#
|
145
|
-
# @return [ Array<Document> ] An array with the document as its only item.
|
146
|
-
def to_a
|
147
|
-
[ self ]
|
148
|
-
end
|
149
|
-
|
150
127
|
# Return a hash of the entire document hierarchy from this document and
|
151
128
|
# below. Used when the attributes are needed for everything and not just
|
152
129
|
# the current document.
|
@@ -180,7 +157,7 @@ module Mongoid
|
|
180
157
|
def as_json(options = nil)
|
181
158
|
rv = super
|
182
159
|
if options && options[:compact]
|
183
|
-
Mongoid.
|
160
|
+
Mongoid::Warnings.warn_as_json_compact_deprecated
|
184
161
|
rv = rv.compact
|
185
162
|
end
|
186
163
|
rv
|
@@ -228,6 +205,38 @@ module Mongoid
|
|
228
205
|
|
229
206
|
private
|
230
207
|
|
208
|
+
# Does the construction of a document.
|
209
|
+
#
|
210
|
+
# @param [ Hash ] attrs The attributes to set up the document with.
|
211
|
+
# @param [ true | false ] execute_callbacks Flag specifies whether callbacks
|
212
|
+
# should be run.
|
213
|
+
#
|
214
|
+
# @return [ Document ] A new document.
|
215
|
+
#
|
216
|
+
# @api private
|
217
|
+
def construct_document(attrs = nil, execute_callbacks: true)
|
218
|
+
@__parent = nil
|
219
|
+
_building do
|
220
|
+
@new_record = true
|
221
|
+
@attributes ||= {}
|
222
|
+
apply_pre_processed_defaults
|
223
|
+
apply_default_scoping
|
224
|
+
process_attributes(attrs) do
|
225
|
+
yield(self) if block_given?
|
226
|
+
end
|
227
|
+
@attributes_before_type_cast = @attributes.merge(attributes_before_type_cast)
|
228
|
+
|
229
|
+
if execute_callbacks
|
230
|
+
apply_post_processed_defaults
|
231
|
+
run_callbacks(:initialize) unless _initialize_callbacks.empty?
|
232
|
+
else
|
233
|
+
pending_callbacks << :apply_post_processed_defaults
|
234
|
+
pending_callbacks << :initialize
|
235
|
+
end
|
236
|
+
end
|
237
|
+
self
|
238
|
+
end
|
239
|
+
|
231
240
|
# Returns the logger
|
232
241
|
#
|
233
242
|
# @return [ Logger ] The configured logger or a default Logger instance.
|
@@ -245,6 +254,14 @@ module Mongoid
|
|
245
254
|
@model_cache_key ||= self.class.model_name.cache_key
|
246
255
|
end
|
247
256
|
|
257
|
+
# Returns a hash of the attributes.
|
258
|
+
#
|
259
|
+
# Note this method modifies the attributes hash that already exists on the
|
260
|
+
# class and returns it. This means that the hash returned by this method
|
261
|
+
# refers to the same hash as calling #attributes on the instance. See
|
262
|
+
# MONGOID-4476 for an explanation on how this is used.
|
263
|
+
#
|
264
|
+
# @return [ Hash ] The attributes hash.
|
248
265
|
def as_attributes
|
249
266
|
return attributes if frozen?
|
250
267
|
embedded_relations.each_pair do |name, meta|
|
@@ -273,20 +290,67 @@ module Mongoid
|
|
273
290
|
# @param [ Hash ] attrs The hash of attributes to instantiate with.
|
274
291
|
# @param [ Integer ] selected_fields The selected fields from the
|
275
292
|
# criteria.
|
293
|
+
# @param [ true | false ] execute_callbacks Flag specifies whether callbacks
|
294
|
+
# should be run.
|
295
|
+
#
|
296
|
+
# @return [ Document ] A new document.
|
297
|
+
def instantiate(attrs = nil, selected_fields = nil, &block)
|
298
|
+
instantiate_document(attrs, selected_fields, execute_callbacks: true, &block)
|
299
|
+
end
|
300
|
+
|
301
|
+
# Instantiate the document.
|
302
|
+
#
|
303
|
+
# @param [ Hash ] attrs The hash of attributes to instantiate with.
|
304
|
+
# @param [ Integer ] selected_fields The selected fields from the
|
305
|
+
# criteria.
|
306
|
+
# @param [ true | false ] execute_callbacks Flag specifies whether callbacks
|
307
|
+
# should be run.
|
276
308
|
#
|
277
309
|
# @return [ Document ] A new document.
|
278
|
-
|
279
|
-
|
310
|
+
#
|
311
|
+
# @api private
|
312
|
+
def instantiate_document(attrs = nil, selected_fields = nil, execute_callbacks: true)
|
313
|
+
attributes = if Mongoid.legacy_attributes
|
314
|
+
attrs
|
315
|
+
else
|
316
|
+
attrs&.to_h
|
317
|
+
end || {}
|
318
|
+
|
280
319
|
doc = allocate
|
281
320
|
doc.__selected_fields = selected_fields
|
282
321
|
doc.instance_variable_set(:@attributes, attributes)
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
doc.
|
322
|
+
# TODO: remove the to_h when the legacy_attributes flag is removed.
|
323
|
+
# The to_h ensures that we don't accidentally make attributes_before_type_cast
|
324
|
+
# a BSON::Document.
|
325
|
+
doc.instance_variable_set(:@attributes_before_type_cast, attributes&.to_h.dup)
|
326
|
+
|
327
|
+
if execute_callbacks
|
328
|
+
doc.apply_defaults
|
329
|
+
yield(doc) if block_given?
|
330
|
+
doc.run_callbacks(:find) unless doc._find_callbacks.empty?
|
331
|
+
doc.run_callbacks(:initialize) unless doc._initialize_callbacks.empty?
|
332
|
+
else
|
333
|
+
yield(doc) if block_given?
|
334
|
+
doc.pending_callbacks += [:apply_defaults, :find, :initialize]
|
335
|
+
end
|
336
|
+
|
287
337
|
doc
|
288
338
|
end
|
289
339
|
|
340
|
+
# Allocates and constructs a document.
|
341
|
+
#
|
342
|
+
# @param [ Hash ] attrs The attributes to set up the document with.
|
343
|
+
# @param [ true | false ] execute_callbacks Flag specifies whether callbacks
|
344
|
+
# should be run.
|
345
|
+
#
|
346
|
+
# @return [ Document ] A new document.
|
347
|
+
#
|
348
|
+
# @api private
|
349
|
+
def construct_document(attrs = nil, execute_callbacks: true)
|
350
|
+
doc = allocate
|
351
|
+
doc.send(:construct_document, attrs, execute_callbacks: execute_callbacks)
|
352
|
+
end
|
353
|
+
|
290
354
|
# Returns all types to query for when using this class as the base.
|
291
355
|
#
|
292
356
|
# @example Get the types.
|