mongoid 7.6.2 → 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 +2 -0
- data/README.md +3 -3
- data/Rakefile +21 -85
- data/lib/config/locales/en.yml +46 -56
- 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/depending.rb +4 -8
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +28 -5
- 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 +2 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +5 -39
- data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
- 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 -18
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
- 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/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/factory.rb +0 -4
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config.rb +15 -73
- data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +63 -47
- data/lib/mongoid/contextual/mongo.rb +173 -287
- data/lib/mongoid/contextual/none.rb +33 -15
- 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 -15
- 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 -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 +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 +0 -12
- 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 +2 -133
- data/lib/mongoid/criteria/queryable/selector.rb +90 -5
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -28
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +88 -33
- data/lib/mongoid/equality.rb +4 -4
- data/lib/mongoid/errors/document_not_found.rb +6 -2
- 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 -3
- 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 +13 -32
- 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 +49 -7
- data/lib/mongoid/findable.rb +21 -16
- 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/matchable.rb +1 -6
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
- data/lib/mongoid/matcher/regex.rb +9 -8
- data/lib/mongoid/matcher.rb +0 -1
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistence_context.rb +8 -42
- 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/scopable.rb +9 -11
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/shardable.rb +11 -35
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/threaded.rb +0 -3
- 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 +1 -0
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -5
- data/lib/mongoid/warnings.rb +3 -5
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -20
- 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/regex.yml +0 -21
- 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 +198 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -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 +36 -51
- 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 +60 -156
- 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 +73 -198
- 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 +480 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +22 -60
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +52 -15
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
- 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 +467 -156
- data/spec/mongoid/contextual/mongo_spec.rb +566 -426
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- data/spec/mongoid/copyable_spec.rb +451 -2
- 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/bignum_spec.rb +1 -2
- 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/fixnum_spec.rb +1 -2
- 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 -2
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
- data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- data/spec/mongoid/criteria_spec.rb +469 -1203
- 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 -236
- 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 +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 +24 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +1 -156
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +36 -34
- data/spec/mongoid/serializable_spec.rb +14 -7
- data/spec/mongoid/shardable_models.rb +0 -14
- data/spec/mongoid/shardable_spec.rb +61 -153
- 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/mongoid_spec.rb +1 -7
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/cluster_config.rb +40 -5
- data/spec/shared/lib/mrss/constraints.rb +46 -7
- data/spec/shared/lib/mrss/docker_runner.rb +21 -17
- data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
- data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
- data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
- data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
- data/spec/shared/lib/mrss/utils.rb +6 -28
- data/spec/shared/share/Dockerfile.erb +114 -38
- data/spec/shared/shlib/distro.sh +0 -10
- data/spec/shared/shlib/server.sh +83 -64
- data/spec/shared/shlib/set_env.sh +81 -16
- data/spec/support/constraints.rb +24 -0
- data/spec/support/expectations.rb +17 -20
- 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 +695 -650
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/lib/mongoid/field_readable.rb +0 -70
- data/lib/mongoid/matcher/regexp_budget.rb +0 -389
- data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
- data/spec/integration/query_operator_guard_spec.rb +0 -89
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
- data/spec/shared/CANDIDATE.md +0 -28
- data/spec/shared/lib/mrss/release/candidate.rb +0 -287
- data/spec/shared/lib/mrss/release/product_data.rb +0 -144
- data/spec/shared/lib/tasks/candidate.rake +0 -64
|
@@ -11,7 +11,7 @@ module Mongoid
|
|
|
11
11
|
#
|
|
12
12
|
# @return [ Hash ] The converted hash.
|
|
13
13
|
def __evolve_object_id__
|
|
14
|
-
|
|
14
|
+
transform_values!(&:__evolve_object_id__)
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
# Mongoizes each value in the hash to an object id if it is convertable.
|
|
@@ -24,7 +24,7 @@ module Mongoid
|
|
|
24
24
|
if id = self['$oid']
|
|
25
25
|
BSON::ObjectId.from_string(id)
|
|
26
26
|
else
|
|
27
|
-
|
|
27
|
+
transform_values!(&:__mongoize_object_id__)
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
|
|
@@ -148,7 +148,7 @@ module Mongoid
|
|
|
148
148
|
# @example Mongoize the object.
|
|
149
149
|
# object.mongoize
|
|
150
150
|
#
|
|
151
|
-
# @return [ Hash ] The object.
|
|
151
|
+
# @return [ Hash | nil ] The object mongoized or nil.
|
|
152
152
|
def mongoize
|
|
153
153
|
::Hash.mongoize(self)
|
|
154
154
|
end
|
|
@@ -163,28 +163,6 @@ module Mongoid
|
|
|
163
163
|
true
|
|
164
164
|
end
|
|
165
165
|
|
|
166
|
-
ALLOWED_TO_CRITERIA_METHODS = %i[
|
|
167
|
-
all all_in all_of and any_in any_of asc ascending
|
|
168
|
-
batch_size between
|
|
169
|
-
collation comment cursor_type
|
|
170
|
-
desc descending
|
|
171
|
-
elem_match eq exists extras
|
|
172
|
-
geo_spatial group gt gte
|
|
173
|
-
hint
|
|
174
|
-
in includes
|
|
175
|
-
limit lt lte
|
|
176
|
-
max_distance max_scan max_time_ms merge mod
|
|
177
|
-
ne near near_sphere nin no_timeout none none_of nor not not_in
|
|
178
|
-
offset only or order order_by
|
|
179
|
-
project
|
|
180
|
-
raw read reorder
|
|
181
|
-
scoped skip slice snapshot
|
|
182
|
-
text_search type
|
|
183
|
-
unscoped unwind
|
|
184
|
-
where with_size with_type without
|
|
185
|
-
].freeze
|
|
186
|
-
private_constant :ALLOWED_TO_CRITERIA_METHODS
|
|
187
|
-
|
|
188
166
|
# Convert this hash to a criteria. Will iterate over each keys in the
|
|
189
167
|
# hash which must correspond to method on a criteria object. The hash
|
|
190
168
|
# must also include a "klass" key.
|
|
@@ -196,11 +174,7 @@ module Mongoid
|
|
|
196
174
|
def to_criteria
|
|
197
175
|
criteria = Criteria.new(delete(:klass) || delete("klass"))
|
|
198
176
|
each_pair do |method, args|
|
|
199
|
-
|
|
200
|
-
unless ALLOWED_TO_CRITERIA_METHODS.include?(method_sym)
|
|
201
|
-
raise ArgumentError, "Method '#{method}' is not allowed in to_criteria"
|
|
202
|
-
end
|
|
203
|
-
criteria = criteria.public_send(method_sym, args)
|
|
177
|
+
criteria = criteria.__send__(method, args)
|
|
204
178
|
end
|
|
205
179
|
criteria
|
|
206
180
|
end
|
|
@@ -243,10 +217,15 @@ module Mongoid
|
|
|
243
217
|
#
|
|
244
218
|
# @param [ Object ] object The object to mongoize.
|
|
245
219
|
#
|
|
246
|
-
# @return [ Hash ] The object mongoized.
|
|
220
|
+
# @return [ Hash | nil ] The object mongoized or nil.
|
|
247
221
|
def mongoize(object)
|
|
248
222
|
return if object.nil?
|
|
249
|
-
|
|
223
|
+
if object.is_a?(Hash)
|
|
224
|
+
# Need to use transform_values! which maintains the BSON::Document
|
|
225
|
+
# instead of transform_values which always returns a hash. To do this,
|
|
226
|
+
# we first need to dup the hash.
|
|
227
|
+
object.dup.transform_values!(&:mongoize)
|
|
228
|
+
end
|
|
250
229
|
end
|
|
251
230
|
|
|
252
231
|
# Can the size of this object change?
|
|
@@ -265,3 +244,5 @@ end
|
|
|
265
244
|
|
|
266
245
|
::Hash.__send__(:include, Mongoid::Extensions::Hash)
|
|
267
246
|
::Hash.extend(Mongoid::Extensions::Hash::ClassMethods)
|
|
247
|
+
|
|
248
|
+
::Mongoid.deprecate(Hash, :blank_criteria)
|
|
@@ -42,12 +42,11 @@ module Mongoid
|
|
|
42
42
|
# @example Mongoize the object.
|
|
43
43
|
# BigDecimal.mongoize("123.11")
|
|
44
44
|
#
|
|
45
|
-
# @return [
|
|
45
|
+
# @return [ Integer | nil ] The object mongoized or nil.
|
|
46
46
|
def mongoize(object)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
nil
|
|
47
|
+
return if object.blank?
|
|
48
|
+
if object.numeric?
|
|
49
|
+
object.to_i
|
|
51
50
|
end
|
|
52
51
|
end
|
|
53
52
|
alias :demongoize :mongoize
|
|
@@ -20,7 +20,7 @@ module Mongoid
|
|
|
20
20
|
# @example Mongoize the object.
|
|
21
21
|
# range.mongoize
|
|
22
22
|
#
|
|
23
|
-
# @return [ Hash ] The object mongoized.
|
|
23
|
+
# @return [ Hash | nil ] The object mongoized or nil.
|
|
24
24
|
def mongoize
|
|
25
25
|
::Range.mongoize(self)
|
|
26
26
|
end
|
|
@@ -44,9 +44,23 @@ module Mongoid
|
|
|
44
44
|
#
|
|
45
45
|
# @param [ Hash ] object The object to demongoize.
|
|
46
46
|
#
|
|
47
|
-
# @return [ Range ] The range.
|
|
47
|
+
# @return [ Range | nil ] The range, or nil if object cannot be represented as range.
|
|
48
|
+
#
|
|
49
|
+
# @note Ruby 2.6 and lower do not support endless ranges that Ruby 2.7+ support.
|
|
48
50
|
def demongoize(object)
|
|
49
|
-
object.nil?
|
|
51
|
+
return if object.nil?
|
|
52
|
+
if object.is_a?(Hash)
|
|
53
|
+
hash = object.slice('min', 'max', 'exclude_end', :min, :max, :exclude_end)
|
|
54
|
+
unless hash.blank?
|
|
55
|
+
begin
|
|
56
|
+
::Range.new(hash["min"] || hash[:min],
|
|
57
|
+
hash["max"] || hash[:max],
|
|
58
|
+
hash["exclude_end"] || hash[:exclude_end])
|
|
59
|
+
rescue ArgumentError # can be removed when Ruby version >= 2.7
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
50
64
|
end
|
|
51
65
|
|
|
52
66
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
@@ -55,16 +69,33 @@ module Mongoid
|
|
|
55
69
|
# @example Mongoize the object.
|
|
56
70
|
# Range.mongoize(1..3)
|
|
57
71
|
#
|
|
58
|
-
# @param [
|
|
72
|
+
# @param [ Object ] object The object to mongoize.
|
|
59
73
|
#
|
|
60
|
-
# @return [ Hash ] The object mongoized.
|
|
74
|
+
# @return [ Hash | nil ] The object mongoized or nil.
|
|
61
75
|
def mongoize(object)
|
|
62
|
-
return
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
return if object.nil?
|
|
77
|
+
case object
|
|
78
|
+
when Hash then __mongoize_hash__(object)
|
|
79
|
+
when Range then __mongoize_range__(object)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
def __mongoize_hash__(object)
|
|
86
|
+
hash = object.stringify_keys
|
|
87
|
+
hash.slice!('min', 'max', 'exclude_end')
|
|
88
|
+
hash.compact!
|
|
89
|
+
hash.transform_values!(&:mongoize)
|
|
90
|
+
hash.blank? ? nil : hash
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def __mongoize_range__(object)
|
|
94
|
+
hash = {}
|
|
95
|
+
hash['min'] = object.begin.mongoize if object.begin
|
|
96
|
+
hash['max'] = object.end.mongoize if object.end
|
|
66
97
|
if object.respond_to?(:exclude_end?) && object.exclude_end?
|
|
67
|
-
hash
|
|
98
|
+
hash['exclude_end'] = true
|
|
68
99
|
end
|
|
69
100
|
hash
|
|
70
101
|
end
|
|
@@ -12,13 +12,20 @@ module Mongoid
|
|
|
12
12
|
# @example Mongoize the object.
|
|
13
13
|
# Regexp.mongoize(/\A[abc]/)
|
|
14
14
|
#
|
|
15
|
-
# @param [
|
|
15
|
+
# @param [ Object ] object The object to mongoize.
|
|
16
16
|
#
|
|
17
|
-
# @return [ Regexp ] The object mongoized.
|
|
17
|
+
# @return [ Regexp | nil ] The object mongoized or nil.
|
|
18
18
|
def mongoize(object)
|
|
19
|
-
return
|
|
20
|
-
|
|
19
|
+
return if object.nil?
|
|
20
|
+
case object
|
|
21
|
+
when String then ::Regexp.new(object)
|
|
22
|
+
when ::Regexp then object
|
|
23
|
+
when BSON::Regexp::Raw then object.compile
|
|
24
|
+
end
|
|
25
|
+
rescue RegexpError
|
|
26
|
+
nil
|
|
21
27
|
end
|
|
28
|
+
alias :demongoize :mongoize
|
|
22
29
|
end
|
|
23
30
|
end
|
|
24
31
|
end
|
|
@@ -10,7 +10,7 @@ module Mongoid
|
|
|
10
10
|
# @example Mongoize the object.
|
|
11
11
|
# set.mongoize
|
|
12
12
|
#
|
|
13
|
-
# @return [ Array ] The object mongoized.
|
|
13
|
+
# @return [ Array | nil ] The object mongoized or nil.
|
|
14
14
|
def mongoize
|
|
15
15
|
::Set.mongoize(self)
|
|
16
16
|
end
|
|
@@ -26,7 +26,10 @@ module Mongoid
|
|
|
26
26
|
#
|
|
27
27
|
# @return [ Set ] The set.
|
|
28
28
|
def demongoize(object)
|
|
29
|
-
|
|
29
|
+
case object
|
|
30
|
+
when ::Set then object
|
|
31
|
+
when ::Array then ::Set.new(object)
|
|
32
|
+
end
|
|
30
33
|
end
|
|
31
34
|
|
|
32
35
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
@@ -37,9 +40,13 @@ module Mongoid
|
|
|
37
40
|
#
|
|
38
41
|
# @param [ Set ] object The object to mongoize.
|
|
39
42
|
#
|
|
40
|
-
# @return [ Array ] The object mongoized.
|
|
43
|
+
# @return [ Array | nil ] The object mongoized or nil.
|
|
41
44
|
def mongoize(object)
|
|
42
|
-
object.
|
|
45
|
+
return if object.nil?
|
|
46
|
+
case object
|
|
47
|
+
when ::Set then ::Array.mongoize(object.to_a).uniq
|
|
48
|
+
when ::Array then ::Array.mongoize(object).uniq
|
|
49
|
+
end
|
|
43
50
|
end
|
|
44
51
|
end
|
|
45
52
|
end
|
|
@@ -149,18 +149,6 @@ module Mongoid
|
|
|
149
149
|
|
|
150
150
|
module ClassMethods
|
|
151
151
|
|
|
152
|
-
# Convert the object from its mongo friendly ruby type to this type.
|
|
153
|
-
#
|
|
154
|
-
# @example Demongoize the object.
|
|
155
|
-
# String.demongoize(object)
|
|
156
|
-
#
|
|
157
|
-
# @param [ Object ] object The object to demongoize.
|
|
158
|
-
#
|
|
159
|
-
# @return [ String ] The object.
|
|
160
|
-
def demongoize(object)
|
|
161
|
-
object.try(:to_s)
|
|
162
|
-
end
|
|
163
|
-
|
|
164
152
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
165
153
|
# type.
|
|
166
154
|
#
|
|
@@ -171,8 +159,9 @@ module Mongoid
|
|
|
171
159
|
#
|
|
172
160
|
# @return [ String ] The object mongoized.
|
|
173
161
|
def mongoize(object)
|
|
174
|
-
|
|
162
|
+
object.try(:to_s)
|
|
175
163
|
end
|
|
164
|
+
alias :demongoize :mongoize
|
|
176
165
|
end
|
|
177
166
|
end
|
|
178
167
|
end
|
|
@@ -16,18 +16,6 @@ module Mongoid
|
|
|
16
16
|
|
|
17
17
|
module ClassMethods
|
|
18
18
|
|
|
19
|
-
# Convert the object from its mongo friendly ruby type to this type.
|
|
20
|
-
#
|
|
21
|
-
# @example Demongoize the object.
|
|
22
|
-
# Symbol.demongoize(object)
|
|
23
|
-
#
|
|
24
|
-
# @param [ Object ] object The object to demongoize.
|
|
25
|
-
#
|
|
26
|
-
# @return [ Symbol ] The object.
|
|
27
|
-
def demongoize(object)
|
|
28
|
-
object.try(:to_sym)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
19
|
# Turn the object from the ruby type we deal with to a Mongo friendly
|
|
32
20
|
# type.
|
|
33
21
|
#
|
|
@@ -36,10 +24,11 @@ module Mongoid
|
|
|
36
24
|
#
|
|
37
25
|
# @param [ Object ] object The object to mongoize.
|
|
38
26
|
#
|
|
39
|
-
# @return [ Symbol ] The object mongoized.
|
|
27
|
+
# @return [ Symbol | nil ] The object mongoized or nil.
|
|
40
28
|
def mongoize(object)
|
|
41
|
-
|
|
29
|
+
object.try(:to_sym)
|
|
42
30
|
end
|
|
31
|
+
alias :demongoize :mongoize
|
|
43
32
|
end
|
|
44
33
|
end
|
|
45
34
|
end
|
|
@@ -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
|
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
|
|
@@ -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
|
|
@@ -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
|
#
|
|
@@ -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.
|
|
@@ -156,6 +161,7 @@ module Mongoid
|
|
|
156
161
|
#
|
|
157
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
|
|
@@ -239,6 +246,32 @@ module Mongoid
|
|
|
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
|
|
@@ -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)
|