mongoid 7.5.0 → 8.0.2
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 +47 -30
- data/lib/mongoid/association/accessors.rb +38 -9
- data/lib/mongoid/association/bindable.rb +50 -2
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/constrainable.rb +0 -1
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +53 -13
- data/lib/mongoid/association/embedded/cyclic.rb +1 -1
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in/proxy.rb +2 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +3 -2
- 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 +50 -28
- data/lib/mongoid/association/embedded/embeds_many.rb +2 -2
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +23 -4
- data/lib/mongoid/association/embedded/embeds_one.rb +3 -3
- data/lib/mongoid/association/macros.rb +2 -1
- data/lib/mongoid/association/many.rb +11 -7
- data/lib/mongoid/association/nested/many.rb +5 -4
- data/lib/mongoid/association/nested/nested_buildable.rb +4 -4
- data/lib/mongoid/association/nested/one.rb +5 -5
- data/lib/mongoid/association/one.rb +2 -2
- data/lib/mongoid/association/options.rb +9 -9
- data/lib/mongoid/association/proxy.rb +14 -3
- data/lib/mongoid/association/referenced/auto_save.rb +4 -3
- 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/proxy.rb +5 -6
- data/lib/mongoid/association/referenced/belongs_to.rb +2 -2
- data/lib/mongoid/association/referenced/counter_cache.rb +10 -10
- data/lib/mongoid/association/referenced/eager.rb +2 -2
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +66 -13
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +6 -3
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +20 -28
- data/lib/mongoid/association/referenced/has_many/proxy.rb +24 -18
- data/lib/mongoid/association/referenced/has_many.rb +3 -3
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/nested_builder.rb +5 -5
- data/lib/mongoid/association/referenced/has_one/proxy.rb +9 -12
- data/lib/mongoid/association/referenced/has_one.rb +3 -3
- data/lib/mongoid/association/referenced/syncable.rb +4 -4
- data/lib/mongoid/association/reflections.rb +2 -2
- data/lib/mongoid/association/relatable.rb +44 -10
- data/lib/mongoid/association.rb +5 -5
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +19 -0
- data/lib/mongoid/attributes/dynamic.rb +3 -3
- data/lib/mongoid/attributes/nested.rb +5 -5
- data/lib/mongoid/attributes/processing.rb +10 -3
- data/lib/mongoid/attributes/projector.rb +1 -1
- data/lib/mongoid/attributes/readonly.rb +2 -2
- data/lib/mongoid/attributes.rb +43 -40
- data/lib/mongoid/changeable.rb +42 -7
- data/lib/mongoid/clients/options.rb +5 -1
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/clients/validators/storage.rb +3 -3
- data/lib/mongoid/config/validators/client.rb +6 -6
- data/lib/mongoid/config.rb +27 -17
- data/lib/mongoid/contextual/aggregable/memory.rb +24 -16
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -5
- data/lib/mongoid/contextual/aggregable/none.rb +1 -1
- data/lib/mongoid/contextual/atomic.rb +1 -1
- data/lib/mongoid/contextual/geo_near.rb +7 -7
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +59 -32
- data/lib/mongoid/contextual/mongo.rb +184 -256
- data/lib/mongoid/contextual/none.rb +34 -16
- data/lib/mongoid/contextual/queryable.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -2
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/findable.rb +7 -4
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/permission.rb +1 -1
- data/lib/mongoid/criteria/queryable/aggregable.rb +2 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +2 -2
- 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 -16
- 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 +3 -3
- data/lib/mongoid/criteria/queryable/extensions/set.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/string.rb +3 -3
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +4 -2
- 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/key.rb +3 -3
- data/lib/mongoid/criteria/queryable/optional.rb +5 -11
- data/lib/mongoid/criteria/queryable/options.rb +2 -2
- data/lib/mongoid/criteria/queryable/pipeline.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +5 -27
- data/lib/mongoid/criteria/queryable/selector.rb +92 -7
- data/lib/mongoid/criteria/queryable/smash.rb +40 -7
- data/lib/mongoid/criteria/queryable.rb +12 -7
- data/lib/mongoid/criteria/scopable.rb +2 -2
- data/lib/mongoid/criteria.rb +15 -37
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +98 -36
- data/lib/mongoid/equality.rb +12 -12
- data/lib/mongoid/errors/document_not_found.rb +10 -6
- data/lib/mongoid/errors/invalid_config_option.rb +1 -1
- data/lib/mongoid/errors/invalid_dependent_strategy.rb +1 -1
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +6 -2
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/invalid_relation.rb +1 -1
- data/lib/mongoid/errors/invalid_relation_option.rb +1 -1
- data/lib/mongoid/errors/invalid_session_use.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/mongoid_error.rb +3 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +1 -1
- data/lib/mongoid/errors/no_client_database.rb +1 -1
- data/lib/mongoid/errors/no_client_hosts.rb +1 -1
- data/lib/mongoid/errors/readonly_attribute.rb +1 -1
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors/unknown_attribute.rb +1 -1
- data/lib/mongoid/errors.rb +2 -2
- data/lib/mongoid/extensions/array.rb +9 -7
- 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/false_class.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +13 -6
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/module.rb +1 -1
- data/lib/mongoid/extensions/object.rb +8 -6
- 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 +11 -22
- data/lib/mongoid/extensions/symbol.rb +4 -15
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions/true_class.rb +1 -1
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +11 -4
- data/lib/mongoid/fields/localized.rb +2 -2
- data/lib/mongoid/fields/standard.rb +7 -7
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +57 -15
- data/lib/mongoid/findable.rb +28 -22
- data/lib/mongoid/indexable/specification.rb +2 -2
- data/lib/mongoid/indexable/validators/options.rb +6 -2
- data/lib/mongoid/interceptable.rb +73 -13
- data/lib/mongoid/matchable.rb +1 -1
- data/lib/mongoid/matcher.rb +12 -7
- data/lib/mongoid/persistable/creatable.rb +18 -9
- data/lib/mongoid/persistable/deletable.rb +1 -1
- data/lib/mongoid/persistable/destroyable.rb +1 -1
- data/lib/mongoid/persistable/savable.rb +2 -2
- data/lib/mongoid/persistable/unsettable.rb +1 -1
- data/lib/mongoid/persistable/updatable.rb +19 -12
- data/lib/mongoid/persistable/upsertable.rb +1 -1
- data/lib/mongoid/persistable.rb +3 -3
- data/lib/mongoid/persistence_context.rb +22 -5
- data/lib/mongoid/query_cache.rb +8 -260
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/scopable.rb +17 -15
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/serializable.rb +10 -6
- data/lib/mongoid/stateful.rb +35 -9
- data/lib/mongoid/tasks/database.rb +0 -2
- data/lib/mongoid/threaded/lifecycle.rb +5 -5
- data/lib/mongoid/threaded.rb +9 -9
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +2 -2
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +4 -3
- data/lib/mongoid/validatable/localizable.rb +1 -1
- data/lib/mongoid/validatable/macros.rb +0 -2
- data/lib/mongoid/validatable/presence.rb +2 -2
- data/lib/mongoid/validatable/uniqueness.rb +9 -8
- data/lib/mongoid/validatable.rb +6 -6
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/warnings.rb +3 -4
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -12
- data/spec/integration/associations/belongs_to_spec.rb +18 -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/i18n_fallbacks_spec.rb +1 -15
- 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/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 +2 -56
- 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/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 +23 -30
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +32 -2
- data/spec/mongoid/config_spec.rb +58 -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 +521 -14
- data/spec/mongoid/contextual/mongo_spec.rb +564 -394
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- 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 +77 -85
- data/spec/mongoid/criteria/queryable/selector_spec.rb +14 -2
- data/spec/mongoid/criteria_spec.rb +469 -1201
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/equality_spec.rb +12 -12
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- 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 +64 -29
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +39 -20
- 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 +54 -16
- 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/event_subscriber.rb +5 -15
- data/spec/support/constraints.rb +24 -0
- data/spec/support/macros.rb +30 -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/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -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.tar.gz.sig +0 -0
- metadata +49 -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
@@ -14,19 +14,13 @@ module Mongoid
|
|
14
14
|
self
|
15
15
|
end
|
16
16
|
|
17
|
-
# Constant for epoch - used when passing invalid times.
|
18
|
-
#
|
19
|
-
# @deprecated No longer used as a return value from #mongoize passed
|
20
|
-
# an invalid time string.
|
21
|
-
EPOCH = ::Time.utc(1970, 1, 1, 0, 0, 0)
|
22
|
-
|
23
17
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
24
18
|
# type.
|
25
19
|
#
|
26
20
|
# @example Mongoize the object.
|
27
21
|
# time.mongoize
|
28
22
|
#
|
29
|
-
# @return [ Time ] The object mongoized.
|
23
|
+
# @return [ Time | nil ] The object mongoized or nil.
|
30
24
|
def mongoize
|
31
25
|
::Time.mongoize(self)
|
32
26
|
end
|
@@ -51,14 +45,28 @@ module Mongoid
|
|
51
45
|
#
|
52
46
|
# @param [ Time ] object The time from Mongo.
|
53
47
|
#
|
54
|
-
# @return [ Time ] The object as a
|
48
|
+
# @return [ Time | nil ] The object as a time.
|
55
49
|
def demongoize(object)
|
56
|
-
return
|
57
|
-
|
50
|
+
return if object.blank?
|
51
|
+
time = if object.acts_like?(:time)
|
52
|
+
Mongoid::Config.use_utc? ? object : object.getlocal
|
53
|
+
elsif object.acts_like?(:date)
|
54
|
+
::Date.demongoize(object).to_time
|
55
|
+
elsif object.is_a?(String)
|
56
|
+
begin
|
57
|
+
object.__mongoize_time__
|
58
|
+
rescue ArgumentError
|
59
|
+
nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
return if time.nil?
|
64
|
+
|
58
65
|
if Mongoid::Config.use_activesupport_time_zone?
|
59
|
-
|
66
|
+
time.in_time_zone(Mongoid.time_zone)
|
67
|
+
else
|
68
|
+
time
|
60
69
|
end
|
61
|
-
object
|
62
70
|
end
|
63
71
|
|
64
72
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
@@ -69,11 +77,16 @@ module Mongoid
|
|
69
77
|
#
|
70
78
|
# @param [ Object ] object The object to mongoize.
|
71
79
|
#
|
72
|
-
# @return [ Time ] The object mongoized.
|
80
|
+
# @return [ Time | nil ] The object mongoized or nil.
|
73
81
|
def mongoize(object)
|
74
|
-
return
|
82
|
+
return if object.blank?
|
75
83
|
begin
|
76
84
|
time = object.__mongoize_time__
|
85
|
+
rescue ArgumentError
|
86
|
+
return
|
87
|
+
end
|
88
|
+
|
89
|
+
if time.acts_like?(:time)
|
77
90
|
if object.respond_to?(:sec_fraction)
|
78
91
|
::Time.at(time.to_i, object.sec_fraction * 10**6).utc
|
79
92
|
elsif time.respond_to?(:subsec)
|
@@ -81,8 +94,6 @@ module Mongoid
|
|
81
94
|
else
|
82
95
|
::Time.at(time.to_i, time.usec).utc
|
83
96
|
end
|
84
|
-
rescue ArgumentError
|
85
|
-
nil
|
86
97
|
end
|
87
98
|
end
|
88
99
|
end
|
@@ -49,8 +49,7 @@ module Mongoid
|
|
49
49
|
#
|
50
50
|
# @return [ TimeWithZone ] The object as a date.
|
51
51
|
def demongoize(object)
|
52
|
-
|
53
|
-
::Time.demongoize(object).in_time_zone
|
52
|
+
::Time.demongoize(object).try(:in_time_zone)
|
54
53
|
end
|
55
54
|
|
56
55
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
@@ -21,7 +21,7 @@ module Mongoid
|
|
21
21
|
#
|
22
22
|
# @param [ Class ] other The class to check.
|
23
23
|
#
|
24
|
-
# @return [ true
|
24
|
+
# @return [ true | false ] If the other is a boolean.
|
25
25
|
def is_a?(other)
|
26
26
|
if other == Mongoid::Boolean || other.class == Mongoid::Boolean
|
27
27
|
return true
|
data/lib/mongoid/extensions.rb
CHANGED
data/lib/mongoid/factory.rb
CHANGED
@@ -6,9 +6,6 @@ module Mongoid
|
|
6
6
|
module Factory
|
7
7
|
extend self
|
8
8
|
|
9
|
-
# @deprecated
|
10
|
-
TYPE = "_type".freeze
|
11
|
-
|
12
9
|
# Builds a new +Document+ from the supplied attributes.
|
13
10
|
#
|
14
11
|
# This method either instantiates klass or a descendant of klass if the attributes include
|
@@ -23,16 +20,32 @@ module Mongoid
|
|
23
20
|
#
|
24
21
|
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
25
22
|
# @param [ Hash ] attributes The document attributes.
|
23
|
+
# @param [ true | false ] execute_callbacks Flag specifies whether callbacks
|
24
|
+
# should be run.
|
26
25
|
#
|
27
26
|
# @return [ Document ] The instantiated document.
|
28
27
|
def build(klass, attributes = nil)
|
28
|
+
execute_build(klass, attributes, execute_callbacks: true)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Execute the build.
|
32
|
+
#
|
33
|
+
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
34
|
+
# @param [ Hash ] attributes The document attributes.
|
35
|
+
# @param [ true | false ] execute_callbacks Flag specifies whether callbacks
|
36
|
+
# should be run.
|
37
|
+
#
|
38
|
+
# @return [ Document ] The instantiated document.
|
39
|
+
#
|
40
|
+
# @api private
|
41
|
+
def execute_build(klass, attributes = nil, execute_callbacks: true)
|
29
42
|
attributes ||= {}
|
30
43
|
dvalue = attributes[klass.discriminator_key] || attributes[klass.discriminator_key.to_sym]
|
31
44
|
type = klass.get_discriminator_mapping(dvalue)
|
32
45
|
if type
|
33
|
-
type.
|
46
|
+
type.construct_document(attributes, execute_callbacks: execute_callbacks)
|
34
47
|
else
|
35
|
-
klass.
|
48
|
+
klass.construct_document(attributes, execute_callbacks: execute_callbacks)
|
36
49
|
end
|
37
50
|
end
|
38
51
|
|
@@ -63,12 +76,34 @@ module Mongoid
|
|
63
76
|
#
|
64
77
|
# @return [ Document ] The instantiated document.
|
65
78
|
def from_db(klass, attributes = nil, criteria = nil, selected_fields = nil)
|
79
|
+
execute_from_db(klass, attributes, criteria, selected_fields, execute_callbacks: true)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Execute from_db.
|
83
|
+
#
|
84
|
+
# @param [ Class ] klass The class to instantiate from if _type is not present.
|
85
|
+
# @param [ Hash ] attributes The document attributes.
|
86
|
+
# @param [ Criteria ] criteria Optional criteria object.
|
87
|
+
# @param [ Hash ] selected_fields Fields which were retrieved via
|
88
|
+
# #only. If selected_fields are specified, fields not listed in it
|
89
|
+
# will not be accessible in the returned document.
|
90
|
+
# @param [ true | false ] execute_callbacks Whether this method should
|
91
|
+
# invoke the callbacks. If true, the callbacks will be invoked normally.
|
92
|
+
# If false, the callbacks will be stored in the +pending_callbacks+ list
|
93
|
+
# and caller is responsible for invoking +run_pending_callbacks+ at a
|
94
|
+
# later time. Use this option to defer callback execution until the
|
95
|
+
# entire object graph containing embedded associations is constructed.
|
96
|
+
#
|
97
|
+
# @return [ Document ] The instantiated document.
|
98
|
+
#
|
99
|
+
# @api private
|
100
|
+
def execute_from_db(klass, attributes = nil, criteria = nil, selected_fields = nil, execute_callbacks: true)
|
66
101
|
if criteria
|
67
102
|
selected_fields ||= criteria.options[:fields]
|
68
103
|
end
|
69
104
|
type = (attributes || {})[klass.discriminator_key]
|
70
105
|
if type.blank?
|
71
|
-
obj = klass.
|
106
|
+
obj = klass.instantiate_document(attributes, selected_fields, execute_callbacks: execute_callbacks)
|
72
107
|
if criteria && criteria.association && criteria.parent_document
|
73
108
|
obj.set_relation(criteria.association.inverse, criteria.parent_document)
|
74
109
|
end
|
@@ -92,7 +127,7 @@ module Mongoid
|
|
92
127
|
raise Errors::UnknownModel.new(camelized, type)
|
93
128
|
end
|
94
129
|
|
95
|
-
constantized.
|
130
|
+
constantized.instantiate_document(attributes, selected_fields, execute_callbacks: execute_callbacks)
|
96
131
|
end
|
97
132
|
end
|
98
133
|
end
|
@@ -43,7 +43,7 @@ module Mongoid
|
|
43
43
|
# @example Is the field a foreign key?
|
44
44
|
# field.foreign_key?
|
45
45
|
#
|
46
|
-
# @return [ true
|
46
|
+
# @return [ true | false ] If the field is a foreign key.
|
47
47
|
def foreign_key?
|
48
48
|
true
|
49
49
|
end
|
@@ -60,6 +60,8 @@ module Mongoid
|
|
60
60
|
if object_id_field? || object.is_a?(Document)
|
61
61
|
if association.polymorphic?
|
62
62
|
association.convert_to_foreign_key(object)
|
63
|
+
elsif object.is_a?(Document) && object.respond_to?(association.primary_key)
|
64
|
+
primary_key_field.evolve(object.send(association.primary_key))
|
63
65
|
else
|
64
66
|
object.__evolve_object_id__
|
65
67
|
end
|
@@ -73,7 +75,7 @@ module Mongoid
|
|
73
75
|
# @example Is the field lazy?
|
74
76
|
# field.lazy?
|
75
77
|
#
|
76
|
-
# @return [ true
|
78
|
+
# @return [ true | false ] If the field is lazy.
|
77
79
|
def lazy?
|
78
80
|
type.resizable?
|
79
81
|
end
|
@@ -99,7 +101,7 @@ module Mongoid
|
|
99
101
|
# @example Is the field a BSON::ObjectId?
|
100
102
|
# field.object_id_field?
|
101
103
|
#
|
102
|
-
# @return [ true
|
104
|
+
# @return [ true | false ] If the field is a BSON::ObjectId.
|
103
105
|
def object_id_field?
|
104
106
|
@object_id_field ||=
|
105
107
|
association.polymorphic? ? true : association.klass.using_object_ids?
|
@@ -110,7 +112,7 @@ module Mongoid
|
|
110
112
|
# @example Is the field resizable?
|
111
113
|
# field.resizable?
|
112
114
|
#
|
113
|
-
# @return [ true
|
115
|
+
# @return [ true | false ] If the field is resizable.
|
114
116
|
def resizable?
|
115
117
|
type.resizable?
|
116
118
|
end
|
@@ -142,6 +144,11 @@ module Mongoid
|
|
142
144
|
@related_id_field ||= association.klass.fields["_id"]
|
143
145
|
end
|
144
146
|
|
147
|
+
def primary_key_field
|
148
|
+
@primary_key_field ||= association.klass.fields[association.primary_key]
|
149
|
+
end
|
150
|
+
|
151
|
+
|
145
152
|
# This is used when default values need to be serialized. Most of the
|
146
153
|
# time just return the object.
|
147
154
|
#
|
@@ -24,7 +24,7 @@ module Mongoid
|
|
24
24
|
# @example Is the field localized?
|
25
25
|
# field.localized?
|
26
26
|
#
|
27
|
-
# @return [ true
|
27
|
+
# @return [ true | false ] If the field is localized.
|
28
28
|
def localized?
|
29
29
|
true
|
30
30
|
end
|
@@ -50,7 +50,7 @@ module Mongoid
|
|
50
50
|
# @example Should fallbacks be used.
|
51
51
|
# field.fallbacks?
|
52
52
|
#
|
53
|
-
# @return [ true
|
53
|
+
# @return [ true | false ] If fallbacks should be used.
|
54
54
|
def fallbacks?
|
55
55
|
return true if options[:fallbacks].nil?
|
56
56
|
!!options[:fallbacks]
|
@@ -48,7 +48,7 @@ module Mongoid
|
|
48
48
|
# @example Is the field a foreign key?
|
49
49
|
# field.foreign_key?
|
50
50
|
#
|
51
|
-
# @return [ true
|
51
|
+
# @return [ true | false ] If the field is a foreign key.
|
52
52
|
def foreign_key?
|
53
53
|
false
|
54
54
|
end
|
@@ -82,7 +82,7 @@ module Mongoid
|
|
82
82
|
# @example Is the field lazy?
|
83
83
|
# field.lazy?
|
84
84
|
#
|
85
|
-
# @return [ true
|
85
|
+
# @return [ true | false ] If the field is lazy.
|
86
86
|
def lazy?
|
87
87
|
false
|
88
88
|
end
|
@@ -92,7 +92,7 @@ module Mongoid
|
|
92
92
|
# @example Is the field localized?
|
93
93
|
# field.localized?
|
94
94
|
#
|
95
|
-
# @return [ true
|
95
|
+
# @return [ true | false ] If the field is localized.
|
96
96
|
def localized?
|
97
97
|
false
|
98
98
|
end
|
@@ -112,7 +112,7 @@ module Mongoid
|
|
112
112
|
# @example Is the field a BSON::ObjectId?
|
113
113
|
# field.object_id_field?
|
114
114
|
#
|
115
|
-
# @return [ true
|
115
|
+
# @return [ true | false ] If the field is a BSON::ObjectId.
|
116
116
|
def object_id_field?
|
117
117
|
@object_id_field ||= (type == BSON::ObjectId)
|
118
118
|
end
|
@@ -122,7 +122,7 @@ module Mongoid
|
|
122
122
|
# @example Does the field pre-process the default?
|
123
123
|
# field.pre_processed?
|
124
124
|
#
|
125
|
-
# @return [ true
|
125
|
+
# @return [ true | false ] If the field's default is pre-processed.
|
126
126
|
def pre_processed?
|
127
127
|
@pre_processed ||=
|
128
128
|
(options[:pre_processed] || (default_val && !default_val.is_a?(::Proc)))
|
@@ -161,7 +161,7 @@ module Mongoid
|
|
161
161
|
#
|
162
162
|
# @note Ruby's instance_exec was just too slow.
|
163
163
|
#
|
164
|
-
# @param [ Class
|
164
|
+
# @param [ Class | Module ] object The class or module the field is
|
165
165
|
# defined on.
|
166
166
|
def define_default_method(object)
|
167
167
|
object.__send__(:define_method, default_name, default_val)
|
@@ -177,7 +177,7 @@ module Mongoid
|
|
177
177
|
#
|
178
178
|
# @param [ Hash ] fields The field limitations.
|
179
179
|
#
|
180
|
-
# @return [ true
|
180
|
+
# @return [ true | false ] If the field was included.
|
181
181
|
def included?(fields)
|
182
182
|
(fields.values.first == 1 && fields[name.to_s] == 1) ||
|
183
183
|
(fields.values.first == 0 && !fields.has_key?(name.to_s))
|
@@ -8,9 +8,6 @@ module Mongoid
|
|
8
8
|
module Macro
|
9
9
|
extend self
|
10
10
|
|
11
|
-
# The warning message to give when a field is of type Symbol.
|
12
|
-
FIELD_TYPE_IS_SYMBOL = 'The BSON symbol type is deprecated; use String instead'.freeze
|
13
|
-
|
14
11
|
OPTIONS = [
|
15
12
|
:as,
|
16
13
|
:default,
|
@@ -69,7 +66,7 @@ module Mongoid
|
|
69
66
|
def validate_field_name(klass, name)
|
70
67
|
[name, "#{name}?".to_sym, "#{name}=".to_sym].each do |n|
|
71
68
|
if Mongoid.destructive_fields.include?(n)
|
72
|
-
raise Errors::InvalidField.new(klass, n)
|
69
|
+
raise Errors::InvalidField.new(klass, name, n)
|
73
70
|
end
|
74
71
|
end
|
75
72
|
end
|
@@ -91,7 +88,7 @@ module Mongoid
|
|
91
88
|
def validate_name_uniqueness(klass, name, options)
|
92
89
|
if !options[:overwrite] && klass.fields.keys.include?(name.to_s)
|
93
90
|
if Mongoid.duplicate_fields_exception
|
94
|
-
raise Errors::InvalidField.new(klass, name)
|
91
|
+
raise Errors::InvalidField.new(klass, name, name)
|
95
92
|
else
|
96
93
|
Mongoid.logger.warn("Overwriting existing field #{name} in class #{klass.name}.") if Mongoid.logger
|
97
94
|
end
|
@@ -117,10 +114,7 @@ module Mongoid
|
|
117
114
|
end
|
118
115
|
|
119
116
|
if option == :type && options[option] == Symbol
|
120
|
-
|
121
|
-
Mongoid.logger.warn(FIELD_TYPE_IS_SYMBOL)
|
122
|
-
true
|
123
|
-
end
|
117
|
+
Mongoid::Warnings.warn_symbol_type_deprecated
|
124
118
|
end
|
125
119
|
end
|
126
120
|
end
|
data/lib/mongoid/fields.rb
CHANGED
@@ -42,6 +42,11 @@ module Mongoid
|
|
42
42
|
# @api private
|
43
43
|
IDS = [ :_id, '_id', ].freeze
|
44
44
|
|
45
|
+
# BSON classes that are not supported as field types
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
INVALID_BSON_CLASSES = [ BSON::Decimal128, BSON::Int32, BSON::Int64 ].freeze
|
49
|
+
|
45
50
|
module ClassMethods
|
46
51
|
# Returns the list of id fields for this model class, as both strings
|
47
52
|
# and symbols.
|
@@ -142,7 +147,7 @@ module Mongoid
|
|
142
147
|
# @example Apply all the non-proc defaults.
|
143
148
|
# model.apply_pre_processed_defaults
|
144
149
|
#
|
145
|
-
# @return [ Array<String ] The names of the non-proc defaults.
|
150
|
+
# @return [ Array<String> ] The names of the non-proc defaults.
|
146
151
|
def apply_pre_processed_defaults
|
147
152
|
pre_processed_defaults.each do |name|
|
148
153
|
apply_default(name)
|
@@ -154,8 +159,9 @@ module Mongoid
|
|
154
159
|
# @example Apply all the proc defaults.
|
155
160
|
# model.apply_post_processed_defaults
|
156
161
|
#
|
157
|
-
# @return [ Array<String ] The names of the proc defaults.
|
162
|
+
# @return [ Array<String> ] The names of the proc defaults.
|
158
163
|
def apply_post_processed_defaults
|
164
|
+
pending_callbacks.delete(:apply_post_processed_defaults)
|
159
165
|
post_processed_defaults.each do |name|
|
160
166
|
apply_default(name)
|
161
167
|
end
|
@@ -184,6 +190,7 @@ module Mongoid
|
|
184
190
|
# @example Apply all the defaults.
|
185
191
|
# model.apply_defaults
|
186
192
|
def apply_defaults
|
193
|
+
pending_callbacks.delete(:apply_defaults)
|
187
194
|
apply_pre_processed_defaults
|
188
195
|
apply_post_processed_defaults
|
189
196
|
end
|
@@ -207,7 +214,7 @@ module Mongoid
|
|
207
214
|
# @example Get the database field name.
|
208
215
|
# model.database_field_name(:authorization)
|
209
216
|
#
|
210
|
-
# @param [ String
|
217
|
+
# @param [ String | Symbol ] name The name to get.
|
211
218
|
#
|
212
219
|
# @return [ String ] The name of the field as it's stored in the db.
|
213
220
|
def database_field_name(name)
|
@@ -222,7 +229,7 @@ module Mongoid
|
|
222
229
|
# @param [ Field ] field The field.
|
223
230
|
# @param [ Object ] value The current value.
|
224
231
|
#
|
225
|
-
# @return [ true
|
232
|
+
# @return [ true | false ] If we set the field lazily.
|
226
233
|
def lazy_settable?(field, value)
|
227
234
|
!frozen? && value.nil? && field.lazy?
|
228
235
|
end
|
@@ -234,11 +241,37 @@ module Mongoid
|
|
234
241
|
# @example Is the document using object ids?
|
235
242
|
# model.using_object_ids?
|
236
243
|
#
|
237
|
-
# @return [ true
|
244
|
+
# @return [ true | false ] Using object ids.
|
238
245
|
def using_object_ids?
|
239
246
|
self.class.using_object_ids?
|
240
247
|
end
|
241
248
|
|
249
|
+
# Does this field start with a dollar sign ($) or contain a dot/period (.)?
|
250
|
+
#
|
251
|
+
# @api private
|
252
|
+
#
|
253
|
+
# @param [ String ] name The field name.
|
254
|
+
#
|
255
|
+
# @return [ true | false ] If this field is dotted or dollared.
|
256
|
+
def dot_dollar_field?(name)
|
257
|
+
n = aliased_fields[name] || name
|
258
|
+
fields.key?(n) && (n.include?('.') || n.start_with?('$'))
|
259
|
+
end
|
260
|
+
|
261
|
+
# Validate whether or not the field starts with a dollar sign ($) or
|
262
|
+
# contains a dot/period (.).
|
263
|
+
#
|
264
|
+
# @api private
|
265
|
+
#
|
266
|
+
# @raise [ InvalidDotDollarAssignment ] If contains dots or starts with a dollar.
|
267
|
+
#
|
268
|
+
# @param [ String ] name The field name.
|
269
|
+
def validate_writable_field_name!(name)
|
270
|
+
if dot_dollar_field?(name)
|
271
|
+
raise Errors::InvalidDotDollarAssignment.new(self.class, name)
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
242
275
|
class << self
|
243
276
|
|
244
277
|
# Stores the provided block to be run when the option name specified is
|
@@ -363,7 +396,7 @@ module Mongoid
|
|
363
396
|
# If the belongs_to association is the last part of the name, we will
|
364
397
|
# pass back the _id field.
|
365
398
|
#
|
366
|
-
# @param [ String
|
399
|
+
# @param [ String | Symbol ] name The name to get.
|
367
400
|
# @param [ Hash ] relations The associations.
|
368
401
|
# @param [ Hash ] alaiased_fields The aliased fields.
|
369
402
|
# @param [ Hash ] alaiased_associations The aliased associations.
|
@@ -422,7 +455,7 @@ module Mongoid
|
|
422
455
|
# Get the name of the provided field as it is stored in the database.
|
423
456
|
# Used in determining if the field is aliased or not.
|
424
457
|
#
|
425
|
-
# @param [ String
|
458
|
+
# @param [ String | Symbol ] name The name to get.
|
426
459
|
#
|
427
460
|
# @return [ String ] The name of the field as it's stored in the db.
|
428
461
|
def database_field_name(name)
|
@@ -474,7 +507,7 @@ module Mongoid
|
|
474
507
|
# @example Does this class use object ids?
|
475
508
|
# person.using_object_ids?
|
476
509
|
#
|
477
|
-
# @return [ true
|
510
|
+
# @return [ true | false ] If the class uses BSON::ObjectIds for the id.
|
478
511
|
def using_object_ids?
|
479
512
|
fields["_id"].object_id_field?
|
480
513
|
end
|
@@ -603,9 +636,7 @@ module Mongoid
|
|
603
636
|
if lazy_settable?(field, raw)
|
604
637
|
write_attribute(name, field.eval_default(self))
|
605
638
|
else
|
606
|
-
|
607
|
-
attribute_will_change!(name) if value.resizable?
|
608
|
-
value
|
639
|
+
process_raw_attribute(name.to_s, raw, field)
|
609
640
|
end
|
610
641
|
end
|
611
642
|
end
|
@@ -697,10 +728,8 @@ module Mongoid
|
|
697
728
|
generated_methods.module_eval do
|
698
729
|
re_define_method("#{meth}_translations=") do |value|
|
699
730
|
attribute_will_change!(name)
|
700
|
-
|
701
|
-
|
702
|
-
field.type.mongoize(_value)
|
703
|
-
end
|
731
|
+
value&.transform_values! do |_value|
|
732
|
+
field.type.mongoize(_value)
|
704
733
|
end
|
705
734
|
attributes[name] = value
|
706
735
|
end
|
@@ -737,6 +766,19 @@ module Mongoid
|
|
737
766
|
opts = options.merge(klass: self)
|
738
767
|
type_mapping = TYPE_MAPPINGS[options[:type]]
|
739
768
|
opts[:type] = type_mapping || unmapped_type(options)
|
769
|
+
if !opts[:type].is_a?(Class)
|
770
|
+
raise Errors::InvalidFieldType.new(self, name, options[:type])
|
771
|
+
else
|
772
|
+
if INVALID_BSON_CLASSES.include?(opts[:type])
|
773
|
+
warn_message = "Using #{opts[:type]} as the field type is not supported. "
|
774
|
+
if opts[:type] == BSON::Decimal128
|
775
|
+
warn_message += "In BSON <= 4, the BSON::Decimal128 type will work as expected for both storing and querying, but will return a BigDecimal on query in BSON 5+."
|
776
|
+
else
|
777
|
+
warn_message += "Saving values of this type to the database will work as expected, however, querying them will return a value of the native Ruby Integer type."
|
778
|
+
end
|
779
|
+
Mongoid.logger.warn(warn_message)
|
780
|
+
end
|
781
|
+
end
|
740
782
|
return Fields::Localized.new(name, opts) if options[:localize]
|
741
783
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
742
784
|
Fields::Standard.new(name, opts)
|
data/lib/mongoid/findable.rb
CHANGED
@@ -38,6 +38,7 @@ module Mongoid
|
|
38
38
|
:max,
|
39
39
|
:min,
|
40
40
|
:none,
|
41
|
+
:pick,
|
41
42
|
:pluck,
|
42
43
|
:read,
|
43
44
|
:sum,
|
@@ -75,7 +76,7 @@ module Mongoid
|
|
75
76
|
# @example Are there no saved documents for this model?
|
76
77
|
# Person.empty?
|
77
78
|
#
|
78
|
-
# @return [ true
|
79
|
+
# @return [ true | false ] If the collection is empty.
|
79
80
|
def empty?
|
80
81
|
count == 0
|
81
82
|
end
|
@@ -86,7 +87,7 @@ module Mongoid
|
|
86
87
|
# @example Do any documents exist for the conditions?
|
87
88
|
# Person.exists?
|
88
89
|
#
|
89
|
-
# @return [ true
|
90
|
+
# @return [ true | false ] If any documents exist for the conditions.
|
90
91
|
def exists?
|
91
92
|
with_default_scope.exists?
|
92
93
|
end
|
@@ -121,18 +122,32 @@ module Mongoid
|
|
121
122
|
# strings will be transparently converted to +BSON::ObjectId+ instances
|
122
123
|
# during query construction.
|
123
124
|
#
|
125
|
+
# If this method is given a block, it delegates to +Enumerable#find+ and
|
126
|
+
# returns the first document of those found by the current Crieria object
|
127
|
+
# for which the block returns a truthy value. If both a block and ids are
|
128
|
+
# given, the block is ignored and the documents for the given ids are
|
129
|
+
# returned. If a block and a Proc are given, the method delegates to
|
130
|
+
# +Enumerable#find+ and uses the proc as the default.
|
131
|
+
#
|
124
132
|
# The +find+ method takes into account the default scope defined on the
|
125
133
|
# model class, if any.
|
126
134
|
#
|
127
|
-
# @
|
128
|
-
# array
|
135
|
+
# @note Each argument can be an individual id, an array of ids or
|
136
|
+
# a nested array. Each array will be flattened.
|
137
|
+
#
|
138
|
+
# @param [ Object | Array<Object> ] *args The _id value(s) to find.
|
129
139
|
#
|
130
140
|
# @return [ Document | Array<Document> | nil ] A document or matching documents.
|
131
141
|
#
|
132
142
|
# @raise Errors::DocumentNotFound If not all documents are found and
|
133
143
|
# the +raise_not_found_error+ Mongoid configuration option is truthy.
|
134
|
-
def find(*args)
|
135
|
-
|
144
|
+
def find(*args, &block)
|
145
|
+
empty_or_proc = args.empty? || (args.length == 1 && args.first.is_a?(Proc))
|
146
|
+
if block_given? && empty_or_proc
|
147
|
+
with_default_scope.find(*args, &block)
|
148
|
+
else
|
149
|
+
with_default_scope.find(*args)
|
150
|
+
end
|
136
151
|
end
|
137
152
|
|
138
153
|
# Find the first +Document+ given the conditions.
|
@@ -148,7 +163,7 @@ module Mongoid
|
|
148
163
|
# @raise [ Errors::DocumentNotFound ] If no document found
|
149
164
|
# and Mongoid.raise_not_found_error is true.
|
150
165
|
#
|
151
|
-
# @return [ Document
|
166
|
+
# @return [ Document | nil ] A matching document.
|
152
167
|
def find_by(attrs = {})
|
153
168
|
result = where(attrs).find_first
|
154
169
|
if result.nil? && Mongoid.raise_not_found_error
|
@@ -169,7 +184,6 @@ module Mongoid
|
|
169
184
|
# @raise [ Errors::DocumentNotFound ] If no document found.
|
170
185
|
#
|
171
186
|
# @return [ Document ] A matching document.
|
172
|
-
#
|
173
187
|
def find_by!(attrs = {})
|
174
188
|
result = where(attrs).find_first
|
175
189
|
raise(Errors::DocumentNotFound.new(self, attrs)) unless result
|
@@ -182,15 +196,11 @@ module Mongoid
|
|
182
196
|
# @example Find the first document.
|
183
197
|
# Person.first
|
184
198
|
#
|
185
|
-
# @param [ Integer
|
186
|
-
# return, or a hash of options.
|
187
|
-
#
|
188
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
189
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
199
|
+
# @param [ Integer ] limit The number of documents to return.
|
190
200
|
#
|
191
201
|
# @return [ Document ] The first matching document.
|
192
|
-
def first(
|
193
|
-
with_default_scope.first(
|
202
|
+
def first(limit = nil)
|
203
|
+
with_default_scope.first(limit)
|
194
204
|
end
|
195
205
|
alias :one :first
|
196
206
|
|
@@ -199,15 +209,11 @@ module Mongoid
|
|
199
209
|
# @example Find the last document.
|
200
210
|
# Person.last
|
201
211
|
#
|
202
|
-
# @param [ Integer
|
203
|
-
# return, or a hash of options.
|
204
|
-
#
|
205
|
-
# @option limit_or_opts [ :none ] :id_sort This option is deprecated.
|
206
|
-
# Don't apply a sort on _id if no other sort is defined on the criteria.
|
212
|
+
# @param [ Integer ] limit The number of documents to return.
|
207
213
|
#
|
208
214
|
# @return [ Document ] The last matching document.
|
209
|
-
def last(
|
210
|
-
with_default_scope.last(
|
215
|
+
def last(limit = nil)
|
216
|
+
with_default_scope.last(limit)
|
211
217
|
end
|
212
218
|
end
|
213
219
|
end
|
@@ -27,7 +27,7 @@ module Mongoid
|
|
27
27
|
#
|
28
28
|
# @param [ Specification ] other The spec to compare against.
|
29
29
|
#
|
30
|
-
# @return [ true
|
30
|
+
# @return [ true | false ] If the specs are equal.
|
31
31
|
def ==(other)
|
32
32
|
fields == other.fields && key == other.key
|
33
33
|
end
|
@@ -86,7 +86,7 @@ module Mongoid
|
|
86
86
|
# @api private
|
87
87
|
#
|
88
88
|
# @example Normalize the index options.
|
89
|
-
# specification.normalize_options(
|
89
|
+
# specification.normalize_options(unique: true)
|
90
90
|
#
|
91
91
|
# @param [ Hash ] opts The index options.
|
92
92
|
#
|