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
@@ -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
|
@@ -270,21 +303,64 @@ module Mongoid
|
|
270
303
|
def options
|
271
304
|
@options ||= {}
|
272
305
|
end
|
273
|
-
end
|
274
|
-
|
275
|
-
module ClassMethods
|
276
306
|
|
277
|
-
#
|
307
|
+
# Traverse down the association tree and search for the field for the
|
308
|
+
# given key. To do this, split the key by '.' and for each part (meth) of
|
309
|
+
# the key:
|
278
310
|
#
|
279
|
-
#
|
280
|
-
#
|
311
|
+
# - If the meth is a field, yield the meth, field, and is_field as true.
|
312
|
+
# - If the meth is an association, update the klass to the association's
|
313
|
+
# klass, and yield the meth, klass, and is_field as false.
|
281
314
|
#
|
282
|
-
#
|
283
|
-
#
|
315
|
+
# The next iteration will use klass's fields and associations to continue
|
316
|
+
# traversing the tree.
|
284
317
|
#
|
285
|
-
# @
|
286
|
-
|
287
|
-
|
318
|
+
# @param [ String ] key The key used to search the association tree.
|
319
|
+
# @param [ Hash ] fields The fields to begin the search with.
|
320
|
+
# @param [ Hash ] associations The associations to begin the search with.
|
321
|
+
# @param [ Hash ] aliased_associations The alaised associations to begin
|
322
|
+
# the search with.
|
323
|
+
# @param [ Proc ] block The block takes in three paramaters, the current
|
324
|
+
# meth, the field or the relation, and whether the second parameter is a
|
325
|
+
# field or not.
|
326
|
+
#
|
327
|
+
# @return [ Field ] The field found for the given key at the end of the
|
328
|
+
# search. This will return nil if the last thing found is an association
|
329
|
+
# or no field was found for the given key.
|
330
|
+
#
|
331
|
+
# @api private
|
332
|
+
def traverse_association_tree(key, fields, associations, aliased_associations)
|
333
|
+
klass = nil
|
334
|
+
field = nil
|
335
|
+
key.split('.').each_with_index do |meth, i|
|
336
|
+
fs = i == 0 ? fields : klass&.fields
|
337
|
+
rs = i == 0 ? associations : klass&.relations
|
338
|
+
as = i == 0 ? aliased_associations : klass&.aliased_associations
|
339
|
+
|
340
|
+
# Associations can possibly have two "keys", their name and their alias.
|
341
|
+
# The fields name is what is used to store it in the klass's relations
|
342
|
+
# and field hashes, and the alias is what's used to store that field
|
343
|
+
# in the database. The key inputted to this function is the aliased
|
344
|
+
# key. We can convert them back to their names by looking in the
|
345
|
+
# aliased_associations hash.
|
346
|
+
aliased = meth
|
347
|
+
if as && a = as.fetch(meth, nil)
|
348
|
+
aliased = a.to_s
|
349
|
+
end
|
350
|
+
|
351
|
+
field = nil
|
352
|
+
klass = nil
|
353
|
+
if fs && f = fs[aliased]
|
354
|
+
field = f
|
355
|
+
yield(meth, f, true) if block_given?
|
356
|
+
elsif rs && rel = rs[aliased]
|
357
|
+
klass = rel.klass
|
358
|
+
yield(meth, rel, false) if block_given?
|
359
|
+
else
|
360
|
+
yield(meth, nil, false) if block_given?
|
361
|
+
end
|
362
|
+
end
|
363
|
+
field
|
288
364
|
end
|
289
365
|
|
290
366
|
# Get the name of the provided field as it is stored in the database.
|
@@ -292,16 +368,43 @@ module Mongoid
|
|
292
368
|
# finds aliases for embedded documents and fields, delimited with
|
293
369
|
# period "." character.
|
294
370
|
#
|
295
|
-
#
|
296
|
-
#
|
371
|
+
# Note that this method returns the name of associations as they're
|
372
|
+
# stored in the database, whereas the `relations` hash uses their in-code
|
373
|
+
# aliases. In order to check for membership in the relations hash, you
|
374
|
+
# would first have to look up the string returned from this method in
|
375
|
+
# the aliased_associations hash.
|
376
|
+
#
|
377
|
+
# This method will not expand the alias of a belongs_to association that
|
378
|
+
# is not the last item. For example, if we had a School that has_many
|
379
|
+
# Students, and the field name passed was (from the Student's perspective):
|
380
|
+
#
|
381
|
+
# school._id
|
382
|
+
#
|
383
|
+
# The alias for a belongs_to association is that association's _id field.
|
384
|
+
# Therefore, expanding out this association would yield:
|
385
|
+
#
|
386
|
+
# school_id._id
|
387
|
+
#
|
388
|
+
# This is not the correct field name, because the intention here was not
|
389
|
+
# to get a property of the _id field. The intention was to get a property
|
390
|
+
# of the referenced document. Therefore, if a part of the name passed is
|
391
|
+
# a belongs_to association that is not the last part of the name, we
|
392
|
+
# won't expand its alias, and return:
|
393
|
+
#
|
394
|
+
# school._id
|
297
395
|
#
|
298
|
-
#
|
299
|
-
#
|
396
|
+
# If the belongs_to association is the last part of the name, we will
|
397
|
+
# pass back the _id field.
|
300
398
|
#
|
301
399
|
# @param [ String, Symbol ] name The name to get.
|
400
|
+
# @param [ Hash ] relations The associations.
|
401
|
+
# @param [ Hash ] alaiased_fields The aliased fields.
|
402
|
+
# @param [ Hash ] alaiased_associations The aliased associations.
|
302
403
|
#
|
303
404
|
# @return [ String ] The name of the field as stored in the database.
|
304
|
-
|
405
|
+
#
|
406
|
+
# @api private
|
407
|
+
def database_field_name(name, relations, aliased_fields, aliased_associations)
|
305
408
|
if Mongoid.broken_alias_handling
|
306
409
|
return nil unless name
|
307
410
|
normalized = name.to_s
|
@@ -310,31 +413,68 @@ module Mongoid
|
|
310
413
|
return nil unless name.present?
|
311
414
|
key = name.to_s
|
312
415
|
segment, remaining = key.split('.', 2)
|
313
|
-
|
416
|
+
|
417
|
+
# Don't get the alias for the field when a belongs_to association
|
418
|
+
# is not the last item. Therefore, get the alias when one of the
|
419
|
+
# following is true:
|
420
|
+
# 1. This is the last item, i.e. there is no remaining.
|
421
|
+
# 2. It is not an association.
|
422
|
+
# 3. It is not a belongs association
|
423
|
+
if !remaining || !relations.key?(segment) || !relations[segment].is_a?(Association::Referenced::BelongsTo)
|
424
|
+
segment = aliased_fields[segment]&.dup || segment
|
425
|
+
end
|
426
|
+
|
314
427
|
return segment unless remaining
|
315
428
|
|
316
429
|
relation = relations[aliased_associations[segment] || segment]
|
317
430
|
if relation
|
318
|
-
|
431
|
+
k = relation.klass
|
432
|
+
"#{segment}.#{database_field_name(remaining, k.relations, k.aliased_fields, k.aliased_associations)}"
|
319
433
|
else
|
320
434
|
"#{segment}.#{remaining}"
|
321
435
|
end
|
322
436
|
end
|
323
437
|
end
|
438
|
+
end
|
439
|
+
|
440
|
+
module ClassMethods
|
441
|
+
|
442
|
+
# Returns an array of names for the attributes available on this object.
|
443
|
+
#
|
444
|
+
# Provides the field names in an ORM-agnostic way. Rails v3.1+ uses this
|
445
|
+
# method to automatically wrap params in JSON requests.
|
446
|
+
#
|
447
|
+
# @example Get the field names
|
448
|
+
# Model.attribute_names
|
449
|
+
#
|
450
|
+
# @return [ Array<String> ] The field names
|
451
|
+
def attribute_names
|
452
|
+
fields.keys
|
453
|
+
end
|
454
|
+
|
455
|
+
# Get the name of the provided field as it is stored in the database.
|
456
|
+
# Used in determining if the field is aliased or not.
|
457
|
+
#
|
458
|
+
# @param [ String, Symbol ] name The name to get.
|
459
|
+
#
|
460
|
+
# @return [ String ] The name of the field as it's stored in the db.
|
461
|
+
def database_field_name(name)
|
462
|
+
Fields.database_field_name(name, relations, aliased_fields, aliased_associations)
|
463
|
+
end
|
324
464
|
|
325
465
|
# Defines all the fields that are accessible on the Document
|
326
466
|
# For each field that is defined, a getter and setter will be
|
327
467
|
# added as an instance method to the Document.
|
328
468
|
#
|
329
469
|
# @example Define a field.
|
330
|
-
# field :score, :
|
470
|
+
# field :score, type: Integer, default: 0
|
331
471
|
#
|
332
472
|
# @param [ Symbol ] name The name of the field.
|
333
473
|
# @param [ Hash ] options The options to pass to the field.
|
334
474
|
#
|
335
|
-
# @option options [ Class ] :type The type of the field.
|
475
|
+
# @option options [ Class | Symbol | String ] :type The type of the field.
|
336
476
|
# @option options [ String ] :label The label for the field.
|
337
|
-
# @option options [ Object
|
477
|
+
# @option options [ Object | Proc ] :default The field's default.
|
338
478
|
#
|
339
479
|
# @return [ Field ] The generated field
|
340
480
|
def field(name, options = {})
|
@@ -372,6 +512,23 @@ module Mongoid
|
|
372
512
|
fields["_id"].object_id_field?
|
373
513
|
end
|
374
514
|
|
515
|
+
# Traverse down the association tree and search for the field for the
|
516
|
+
# given key.
|
517
|
+
#
|
518
|
+
# @param [ String ] key The key used to search the association tree.
|
519
|
+
# @param [ Proc ] block The block takes in three paramaters, the current
|
520
|
+
# meth, the field or the relation, and whether the second parameter is a
|
521
|
+
# field or not.
|
522
|
+
#
|
523
|
+
# @return [ Field ] The field found for the given key at the end of the
|
524
|
+
# search. This will return nil if the last thing found is an association
|
525
|
+
# or no field was found for the given key.
|
526
|
+
#
|
527
|
+
# @api private
|
528
|
+
def traverse_association_tree(key, &block)
|
529
|
+
Fields.traverse_association_tree(key, fields, relations, aliased_associations, &block)
|
530
|
+
end
|
531
|
+
|
375
532
|
protected
|
376
533
|
|
377
534
|
# Add the defaults to the model. This breaks them up between ones that
|
@@ -479,9 +636,7 @@ module Mongoid
|
|
479
636
|
if lazy_settable?(field, raw)
|
480
637
|
write_attribute(name, field.eval_default(self))
|
481
638
|
else
|
482
|
-
|
483
|
-
attribute_will_change!(name) if value.resizable?
|
484
|
-
value
|
639
|
+
process_raw_attribute(name.to_s, raw, field)
|
485
640
|
end
|
486
641
|
end
|
487
642
|
end
|
@@ -573,10 +728,8 @@ module Mongoid
|
|
573
728
|
generated_methods.module_eval do
|
574
729
|
re_define_method("#{meth}_translations=") do |value|
|
575
730
|
attribute_will_change!(name)
|
576
|
-
|
577
|
-
|
578
|
-
field.type.mongoize(_value)
|
579
|
-
end
|
731
|
+
value&.transform_values! do |_value|
|
732
|
+
field.type.mongoize(_value)
|
580
733
|
end
|
581
734
|
attributes[name] = value
|
582
735
|
end
|
@@ -613,6 +766,19 @@ module Mongoid
|
|
613
766
|
opts = options.merge(klass: self)
|
614
767
|
type_mapping = TYPE_MAPPINGS[options[:type]]
|
615
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
|
616
782
|
return Fields::Localized.new(name, opts) if options[:localize]
|
617
783
|
return Fields::ForeignKey.new(name, opts) if options[:identity]
|
618
784
|
Fields::Standard.new(name, opts)
|