mongoid 3.1.6 → 4.0.0
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
- data/CHANGELOG.md +432 -8
- data/README.md +5 -6
- data/lib/config/locales/en.yml +32 -18
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/atomic.rb +1 -12
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/attributes.rb +63 -101
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +18 -6
- data/lib/mongoid/contextual/mongo.rb +64 -56
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/document.rb +32 -17
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/extensions.rb +2 -7
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/{finders.rb → findable.rb} +8 -2
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/persistable/creatable.rb +188 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +152 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +247 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations/accessors.rb +13 -49
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +1 -24
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +30 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +19 -32
- data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +180 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/threaded.rb +0 -157
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +10 -76
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +315 -436
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +68 -58
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +151 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +578 -2295
- data/spec/mongoid/document_spec.rb +166 -120
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +461 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
- data/spec/mongoid/query_cache_spec.rb +231 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +107 -0
- data/spec/mongoid/sessions_spec.rb +289 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +29 -13
- metadata +296 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
|
@@ -29,7 +29,7 @@ module Mongoid
|
|
|
29
29
|
return concat(docs) if docs.size > 1
|
|
30
30
|
if doc = docs.first
|
|
31
31
|
append(doc)
|
|
32
|
-
base.add_to_set(foreign_key
|
|
32
|
+
base.add_to_set(foreign_key => doc.send(__metadata.primary_key))
|
|
33
33
|
if child_persistable?(doc)
|
|
34
34
|
doc.save
|
|
35
35
|
end
|
|
@@ -65,7 +65,7 @@ module Mongoid
|
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
if persistable? || _creating?
|
|
68
|
-
base.
|
|
68
|
+
base.push(foreign_key => ids.keys)
|
|
69
69
|
end
|
|
70
70
|
persist_delayed(docs, inserts)
|
|
71
71
|
self
|
|
@@ -77,25 +77,19 @@ module Mongoid
|
|
|
77
77
|
# @example Build a new document on the relation.
|
|
78
78
|
# person.posts.build(:title => "A new post")
|
|
79
79
|
#
|
|
80
|
-
# @overload build(attributes = {},
|
|
80
|
+
# @overload build(attributes = {}, type = nil)
|
|
81
81
|
# @param [ Hash ] attributes The attributes of the new document.
|
|
82
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
83
82
|
# @param [ Class ] type The optional subclass to build.
|
|
84
83
|
#
|
|
85
84
|
# @overload build(attributes = {}, type = nil)
|
|
86
85
|
# @param [ Hash ] attributes The attributes of the new document.
|
|
87
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
88
86
|
# @param [ Class ] type The optional subclass to build.
|
|
89
87
|
#
|
|
90
88
|
# @return [ Document ] The new document.
|
|
91
89
|
#
|
|
92
90
|
# @since 2.0.0.beta.1
|
|
93
|
-
def build(attributes = {},
|
|
94
|
-
|
|
95
|
-
options, type = {}, options
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
doc = Factory.build(type || klass, attributes, options)
|
|
91
|
+
def build(attributes = {}, type = nil)
|
|
92
|
+
doc = Factory.build(type || klass, attributes)
|
|
99
93
|
base.send(foreign_key).push(doc.id)
|
|
100
94
|
append(doc)
|
|
101
95
|
doc.apply_post_processed_defaults
|
|
@@ -120,7 +114,7 @@ module Mongoid
|
|
|
120
114
|
def delete(document)
|
|
121
115
|
doc = super
|
|
122
116
|
if doc && persistable?
|
|
123
|
-
base.pull(foreign_key
|
|
117
|
+
base.pull(foreign_key => doc.send(__metadata.primary_key))
|
|
124
118
|
target._unloaded = criteria
|
|
125
119
|
unsynced(base, foreign_key)
|
|
126
120
|
end
|
|
@@ -139,19 +133,16 @@ module Mongoid
|
|
|
139
133
|
target.each do |doc|
|
|
140
134
|
execute_callback :before_remove, doc
|
|
141
135
|
end
|
|
142
|
-
unless
|
|
143
|
-
criteria.pull(inverse_foreign_key
|
|
136
|
+
unless __metadata.forced_nil_inverse?
|
|
137
|
+
criteria.pull(inverse_foreign_key => base.id)
|
|
144
138
|
end
|
|
145
139
|
if persistable?
|
|
146
|
-
base.set(
|
|
147
|
-
foreign_key,
|
|
148
|
-
base.send(foreign_key).clear
|
|
149
|
-
)
|
|
140
|
+
base.set(foreign_key => base.send(foreign_key).clear)
|
|
150
141
|
end
|
|
151
142
|
after_remove_error = nil
|
|
152
143
|
many_to_many = target.clear do |doc|
|
|
153
144
|
unbind_one(doc)
|
|
154
|
-
unless
|
|
145
|
+
unless __metadata.forced_nil_inverse?
|
|
155
146
|
doc.changed_attributes.delete(inverse_foreign_key)
|
|
156
147
|
end
|
|
157
148
|
begin
|
|
@@ -230,7 +221,7 @@ module Mongoid
|
|
|
230
221
|
#
|
|
231
222
|
# @since 2.0.0.rc.1
|
|
232
223
|
def binding
|
|
233
|
-
Bindings::Referenced::ManyToMany.new(base, target,
|
|
224
|
+
Bindings::Referenced::ManyToMany.new(base, target, __metadata)
|
|
234
225
|
end
|
|
235
226
|
|
|
236
227
|
# Determine if the child document should be persisted.
|
|
@@ -247,7 +238,7 @@ module Mongoid
|
|
|
247
238
|
# @since 3.0.20
|
|
248
239
|
def child_persistable?(doc)
|
|
249
240
|
(persistable? || _creating?) &&
|
|
250
|
-
!(doc.persisted? &&
|
|
241
|
+
!(doc.persisted? && __metadata.forced_nil_inverse?)
|
|
251
242
|
end
|
|
252
243
|
|
|
253
244
|
# Returns the criteria object for the target class with its documents set
|
|
@@ -258,7 +249,7 @@ module Mongoid
|
|
|
258
249
|
#
|
|
259
250
|
# @return [ Criteria ] A new criteria.
|
|
260
251
|
def criteria
|
|
261
|
-
ManyToMany.criteria(
|
|
252
|
+
ManyToMany.criteria(__metadata, base.send(foreign_key))
|
|
262
253
|
end
|
|
263
254
|
|
|
264
255
|
# Flag the base as unsynced with respect to the foreign key.
|
|
@@ -320,22 +311,8 @@ module Mongoid
|
|
|
320
311
|
)
|
|
321
312
|
end
|
|
322
313
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
#
|
|
326
|
-
# @example Get the eager load criteria.
|
|
327
|
-
# Proxy.eager_load(metadata, criteria)
|
|
328
|
-
#
|
|
329
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
330
|
-
# @param [ Array<Object> ] ids The ids of the documents to load.
|
|
331
|
-
#
|
|
332
|
-
# @return [ Criteria ] The criteria to eager load the relation.
|
|
333
|
-
#
|
|
334
|
-
# @since 2.2.0
|
|
335
|
-
def eager_load(metadata, ids)
|
|
336
|
-
metadata.klass.any_in(_id: ids).each do |doc|
|
|
337
|
-
IdentityMap.set(doc)
|
|
338
|
-
end
|
|
314
|
+
def eager_load_klass
|
|
315
|
+
Relations::Eager::HasAndBelongsToMany
|
|
339
316
|
end
|
|
340
317
|
|
|
341
318
|
# Returns true if the relation is an embedded one. In this case
|
|
@@ -53,13 +53,13 @@ module Mongoid
|
|
|
53
53
|
def substitute(replacement)
|
|
54
54
|
unbind_one
|
|
55
55
|
if persistable?
|
|
56
|
-
if
|
|
57
|
-
send(
|
|
56
|
+
if __metadata.destructive?
|
|
57
|
+
send(__metadata.dependent)
|
|
58
58
|
else
|
|
59
59
|
save if persisted?
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
|
-
One.new(base, replacement,
|
|
62
|
+
One.new(base, replacement, __metadata) if replacement
|
|
63
63
|
end
|
|
64
64
|
|
|
65
65
|
private
|
|
@@ -73,7 +73,7 @@ module Mongoid
|
|
|
73
73
|
#
|
|
74
74
|
# @return [ Binding ] The binding object.
|
|
75
75
|
def binding
|
|
76
|
-
Bindings::Referenced::One.new(base, target,
|
|
76
|
+
Bindings::Referenced::One.new(base, target, __metadata)
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
# Are we able to persist this relation?
|
|
@@ -122,33 +122,14 @@ module Mongoid
|
|
|
122
122
|
# @since 2.1.0
|
|
123
123
|
def criteria(metadata, object, type = nil)
|
|
124
124
|
crit = metadata.klass.where(metadata.foreign_key => object)
|
|
125
|
-
|
|
126
125
|
if metadata.polymorphic?
|
|
127
126
|
crit = crit.where(metadata.type => type.name)
|
|
128
127
|
end
|
|
129
|
-
|
|
130
|
-
inverse_metadata = metadata.inverse_metadata(metadata.klass)
|
|
131
|
-
if inverse_metadata.inverse_of_field
|
|
132
|
-
crit = crit.any_in(inverse_metadata.inverse_of_field => [metadata.name, nil])
|
|
133
|
-
end
|
|
134
|
-
|
|
135
128
|
crit
|
|
136
129
|
end
|
|
137
130
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
#
|
|
141
|
-
# @example Get the eager load criteria.
|
|
142
|
-
# Proxy.eager_load(metadata, criteria)
|
|
143
|
-
#
|
|
144
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
145
|
-
# @param [ Array<Object> ] ids The ids of the base docs.
|
|
146
|
-
#
|
|
147
|
-
# @return [ Criteria ] The criteria to eager load the relation.
|
|
148
|
-
#
|
|
149
|
-
# @since 2.2.0
|
|
150
|
-
def eager_load(metadata, ids)
|
|
151
|
-
eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_one(doc, key) }
|
|
131
|
+
def eager_load_klass
|
|
132
|
+
Relations::Eager::HasOne
|
|
152
133
|
end
|
|
153
134
|
|
|
154
135
|
# Returns true if the relation is an embedded one. In this case
|
|
@@ -61,7 +61,7 @@ module Mongoid
|
|
|
61
61
|
def remove_inverse_keys(meta)
|
|
62
62
|
foreign_keys = send(meta.foreign_key)
|
|
63
63
|
unless foreign_keys.nil? || foreign_keys.empty?
|
|
64
|
-
meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key
|
|
64
|
+
meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key => id)
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -92,10 +92,10 @@ module Mongoid
|
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
unless adds.empty?
|
|
95
|
-
meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key
|
|
95
|
+
meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key => id)
|
|
96
96
|
end
|
|
97
97
|
unless subs.empty?
|
|
98
|
-
meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key
|
|
98
|
+
meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key => id)
|
|
99
99
|
end
|
|
100
100
|
end
|
|
101
101
|
end
|
|
@@ -4,6 +4,39 @@ module Mongoid
|
|
|
4
4
|
module Touchable
|
|
5
5
|
extend ActiveSupport::Concern
|
|
6
6
|
|
|
7
|
+
# Touch the document, in effect updating its updated_at timestamp and
|
|
8
|
+
# optionally the provided field to the current time. If any belongs_to
|
|
9
|
+
# relations exist with a touch option, they will be updated as well.
|
|
10
|
+
#
|
|
11
|
+
# @example Update the updated_at timestamp.
|
|
12
|
+
# document.touch
|
|
13
|
+
#
|
|
14
|
+
# @example Update the updated_at and provided timestamps.
|
|
15
|
+
# document.touch(:audited)
|
|
16
|
+
#
|
|
17
|
+
# @note This will not autobuild relations if those options are set.
|
|
18
|
+
#
|
|
19
|
+
# @param [ Symbol ] field The name of an additional field to update.
|
|
20
|
+
#
|
|
21
|
+
# @return [ true/false ] false if record is new_record otherwise true.
|
|
22
|
+
#
|
|
23
|
+
# @since 3.0.0
|
|
24
|
+
def touch(field = nil)
|
|
25
|
+
return false if _root.new_record?
|
|
26
|
+
current = Time.now
|
|
27
|
+
field = database_field_name(field)
|
|
28
|
+
write_attribute(:updated_at, current) if respond_to?("updated_at=")
|
|
29
|
+
write_attribute(field, current) if field
|
|
30
|
+
|
|
31
|
+
touches = touch_atomic_updates(field)
|
|
32
|
+
unless touches.empty?
|
|
33
|
+
selector = atomic_selector
|
|
34
|
+
_root.collection.where(selector).update(positionally(selector, touches))
|
|
35
|
+
end
|
|
36
|
+
run_callbacks(:touch)
|
|
37
|
+
true
|
|
38
|
+
end
|
|
39
|
+
|
|
7
40
|
module ClassMethods
|
|
8
41
|
|
|
9
42
|
# Add the metadata to the touchable relations if the touch option was
|
|
@@ -21,7 +54,7 @@ module Mongoid
|
|
|
21
54
|
if metadata.touchable?
|
|
22
55
|
name = metadata.name
|
|
23
56
|
method_name = define_relation_touch_method(name)
|
|
24
|
-
|
|
57
|
+
after_save method_name
|
|
25
58
|
after_destroy method_name
|
|
26
59
|
after_touch method_name
|
|
27
60
|
end
|
data/lib/mongoid/relations.rb
CHANGED
|
@@ -46,7 +46,8 @@ module Mongoid
|
|
|
46
46
|
include Touchable
|
|
47
47
|
include CounterCache
|
|
48
48
|
|
|
49
|
-
attr_accessor :
|
|
49
|
+
attr_accessor :__metadata
|
|
50
|
+
alias :relation_metadata :__metadata
|
|
50
51
|
|
|
51
52
|
# Determine if the document itself is embedded in another document via the
|
|
52
53
|
# proper channels. (If it has a parent document.)
|
|
@@ -70,7 +71,7 @@ module Mongoid
|
|
|
70
71
|
#
|
|
71
72
|
# @since 2.0.0.rc.1
|
|
72
73
|
def embedded_many?
|
|
73
|
-
|
|
74
|
+
__metadata && __metadata.macro == :embeds_many
|
|
74
75
|
end
|
|
75
76
|
|
|
76
77
|
# Determine if the document is part of an embeds_one relation.
|
|
@@ -82,7 +83,7 @@ module Mongoid
|
|
|
82
83
|
#
|
|
83
84
|
# @since 2.0.0.rc.1
|
|
84
85
|
def embedded_one?
|
|
85
|
-
|
|
86
|
+
__metadata && __metadata.macro == :embeds_one
|
|
86
87
|
end
|
|
87
88
|
|
|
88
89
|
# Get the metadata name for this document. If no metadata was defined
|
|
@@ -97,8 +98,8 @@ module Mongoid
|
|
|
97
98
|
#
|
|
98
99
|
# @since 3.0.0
|
|
99
100
|
def metadata_name
|
|
100
|
-
raise Errors::NoMetadata.new(self.class.name) unless
|
|
101
|
-
|
|
101
|
+
raise Errors::NoMetadata.new(self.class.name) unless __metadata
|
|
102
|
+
__metadata.name
|
|
102
103
|
end
|
|
103
104
|
|
|
104
105
|
# Determine if the document is part of an references_many relation.
|
|
@@ -110,7 +111,7 @@ module Mongoid
|
|
|
110
111
|
#
|
|
111
112
|
# @since 2.0.0.rc.1
|
|
112
113
|
def referenced_many?
|
|
113
|
-
|
|
114
|
+
__metadata && __metadata.macro == :has_many
|
|
114
115
|
end
|
|
115
116
|
|
|
116
117
|
# Determine if the document is part of an references_one relation.
|
|
@@ -122,7 +123,7 @@ module Mongoid
|
|
|
122
123
|
#
|
|
123
124
|
# @since 2.0.0.rc.1
|
|
124
125
|
def referenced_one?
|
|
125
|
-
|
|
126
|
+
__metadata && __metadata.macro == :has_one
|
|
126
127
|
end
|
|
127
128
|
|
|
128
129
|
# Convenience method for iterating through the loaded relations and
|
|
@@ -136,27 +137,12 @@ module Mongoid
|
|
|
136
137
|
# @since 2.1.6
|
|
137
138
|
def reload_relations
|
|
138
139
|
relations.each_pair do |name, meta|
|
|
139
|
-
if instance_variable_defined?("
|
|
140
|
-
if _parent.nil? || instance_variable_get("
|
|
141
|
-
remove_instance_variable("
|
|
140
|
+
if instance_variable_defined?("@_#{name}")
|
|
141
|
+
if _parent.nil? || instance_variable_get("@_#{name}") != _parent
|
|
142
|
+
remove_instance_variable("@_#{name}")
|
|
142
143
|
end
|
|
143
144
|
end
|
|
144
145
|
end
|
|
145
146
|
end
|
|
146
|
-
|
|
147
|
-
module ClassMethods
|
|
148
|
-
|
|
149
|
-
# This is convenience for librarys still on the old API.
|
|
150
|
-
#
|
|
151
|
-
# @example Get the associations.
|
|
152
|
-
# Person.associations
|
|
153
|
-
#
|
|
154
|
-
# @return [ Hash ] The relations.
|
|
155
|
-
#
|
|
156
|
-
# @since 2.3.1
|
|
157
|
-
def associations
|
|
158
|
-
self.relations
|
|
159
|
-
end
|
|
160
|
-
end
|
|
161
147
|
end
|
|
162
148
|
end
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
module Mongoid
|
|
3
|
+
|
|
3
4
|
# This module handles reloading behaviour of documents.
|
|
4
|
-
|
|
5
|
+
#
|
|
6
|
+
# @since 4.0.0
|
|
7
|
+
module Reloadable
|
|
5
8
|
|
|
6
9
|
# Reloads the +Document+ attributes from the database. If the document has
|
|
7
10
|
# not been saved then an error will get raised if the configuration option
|
|
@@ -25,7 +28,6 @@ module Mongoid
|
|
|
25
28
|
changed_attributes.clear
|
|
26
29
|
apply_defaults
|
|
27
30
|
reload_relations
|
|
28
|
-
IdentityMap.set(self)
|
|
29
31
|
run_callbacks(:find) unless _find_callbacks.empty?
|
|
30
32
|
run_callbacks(:initialize) unless _initialize_callbacks.empty?
|
|
31
33
|
self
|
|
@@ -55,7 +57,7 @@ module Mongoid
|
|
|
55
57
|
#
|
|
56
58
|
# @since 2.3.2
|
|
57
59
|
def reload_root_document
|
|
58
|
-
{}.merge(with(
|
|
60
|
+
{}.merge(with(read: :primary).collection.find(_id: id).one || {})
|
|
59
61
|
end
|
|
60
62
|
|
|
61
63
|
# Reload the embedded document.
|
|
@@ -68,7 +70,7 @@ module Mongoid
|
|
|
68
70
|
# @since 2.3.2
|
|
69
71
|
def reload_embedded_document
|
|
70
72
|
extract_embedded_attributes({}.merge(
|
|
71
|
-
_root.with(
|
|
73
|
+
_root.with(read: :primary).collection.find(_id: _root.id).one
|
|
72
74
|
))
|
|
73
75
|
end
|
|
74
76
|
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
+
|
|
2
3
|
module Mongoid
|
|
3
4
|
|
|
4
5
|
# This module contains behaviour for all Mongoid scoping - named scopes,
|
|
5
6
|
# default scopes, and criteria accessors via scoped and unscoped.
|
|
6
|
-
|
|
7
|
+
#
|
|
8
|
+
# @since 4.0.0
|
|
9
|
+
module Scopable
|
|
7
10
|
extend ActiveSupport::Concern
|
|
8
11
|
|
|
9
12
|
included do
|
|
@@ -12,6 +15,27 @@ module Mongoid
|
|
|
12
15
|
self._declared_scopes = {}
|
|
13
16
|
end
|
|
14
17
|
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
# Apply the default scoping to the attributes of the document, as long as
|
|
21
|
+
# they are not complex queries.
|
|
22
|
+
#
|
|
23
|
+
# @api private
|
|
24
|
+
#
|
|
25
|
+
# @example Apply the default scoping.
|
|
26
|
+
# document.apply_default_scoping
|
|
27
|
+
#
|
|
28
|
+
# @return [ true, false ] If default scoping was applied.
|
|
29
|
+
#
|
|
30
|
+
# @since 4.0.0
|
|
31
|
+
def apply_default_scoping
|
|
32
|
+
if default_scoping
|
|
33
|
+
default_scoping.call.selector.each do |field, value|
|
|
34
|
+
attributes[field] = value unless value.respond_to?(:each_pair)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
15
39
|
module ClassMethods
|
|
16
40
|
|
|
17
41
|
# Returns a hash of all the scopes defined for this class, including
|
|
@@ -22,7 +46,7 @@ module Mongoid
|
|
|
22
46
|
# include Mongoid::Document
|
|
23
47
|
# field :active, type: Boolean
|
|
24
48
|
#
|
|
25
|
-
# scope :active, where(active: true)
|
|
49
|
+
# scope :active, -> { where(active: true) }
|
|
26
50
|
# end
|
|
27
51
|
# Band.scopes
|
|
28
52
|
#
|
|
@@ -104,14 +128,14 @@ module Mongoid
|
|
|
104
128
|
# field :active, type: Boolean
|
|
105
129
|
# field :count, type: Integer
|
|
106
130
|
#
|
|
107
|
-
# scope :active, where(active: true)
|
|
131
|
+
# scope :active, -> { where(active: true) }
|
|
108
132
|
# scope :at_least, ->(count){ where(:count.gt => count) }
|
|
109
133
|
# end
|
|
110
134
|
#
|
|
111
135
|
# @param [ Symbol ] name The name of the scope.
|
|
112
|
-
# @param [ Proc
|
|
136
|
+
# @param [ Proc ] conditions The conditions of the scope.
|
|
113
137
|
#
|
|
114
|
-
# @raise [ Errors::InvalidScope ] If the scope is not a proc
|
|
138
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a proc.
|
|
115
139
|
# @raise [ Errors::ScopeOverwrite ] If the scope name already exists.
|
|
116
140
|
#
|
|
117
141
|
# @since 1.0.0
|
|
@@ -120,7 +144,7 @@ module Mongoid
|
|
|
120
144
|
check_scope_validity(value)
|
|
121
145
|
check_scope_name(normalized)
|
|
122
146
|
_declared_scopes[normalized] = {
|
|
123
|
-
scope:
|
|
147
|
+
scope: value,
|
|
124
148
|
extension: Module.new(&block)
|
|
125
149
|
}
|
|
126
150
|
define_scope_method(normalized)
|
|
@@ -279,7 +303,7 @@ module Mongoid
|
|
|
279
303
|
#
|
|
280
304
|
# @since 3.0.0
|
|
281
305
|
def check_scope_validity(value)
|
|
282
|
-
unless value.respond_to?(:
|
|
306
|
+
unless value.respond_to?(:call)
|
|
283
307
|
raise Errors::InvalidScope.new(self, value)
|
|
284
308
|
end
|
|
285
309
|
end
|
|
@@ -298,15 +322,15 @@ module Mongoid
|
|
|
298
322
|
#
|
|
299
323
|
# @since 3.0.0
|
|
300
324
|
def define_scope_method(name)
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
scoping = _declared_scopes[
|
|
325
|
+
singleton_class.class_eval do
|
|
326
|
+
define_method name do |*args|
|
|
327
|
+
scoping = _declared_scopes[name]
|
|
304
328
|
scope, extension = scoping[:scope][*args], scoping[:extension]
|
|
305
|
-
criteria = with_default_scope.merge(scope ||
|
|
329
|
+
criteria = with_default_scope.merge(scope || queryable)
|
|
306
330
|
criteria.extend(extension)
|
|
307
331
|
criteria
|
|
308
332
|
end
|
|
309
|
-
|
|
333
|
+
end
|
|
310
334
|
end
|
|
311
335
|
|
|
312
336
|
# Process the default scope value. If one already exists, we merge the
|
|
@@ -327,30 +351,6 @@ module Mongoid
|
|
|
327
351
|
value.to_proc
|
|
328
352
|
end
|
|
329
353
|
end
|
|
330
|
-
|
|
331
|
-
# Strip the default scope from the provided value, if it is a criteria.
|
|
332
|
-
# This is used by named scopes - they should not have the default scoping
|
|
333
|
-
# applied to them.
|
|
334
|
-
#
|
|
335
|
-
# @api private
|
|
336
|
-
#
|
|
337
|
-
# @example Strip the default scope.
|
|
338
|
-
# Model.strip_default_scope
|
|
339
|
-
#
|
|
340
|
-
# @param [ Proc, Criteria ] value The value to strip from.
|
|
341
|
-
#
|
|
342
|
-
# @return [ Proc ] The stripped criteria, as a proc.
|
|
343
|
-
#
|
|
344
|
-
# @since 3.0.0
|
|
345
|
-
def strip_default_scope(value)
|
|
346
|
-
if value.is_a?(Criteria)
|
|
347
|
-
default = default_scoping.try(:call)
|
|
348
|
-
value.remove_scoping(default)
|
|
349
|
-
value.to_proc
|
|
350
|
-
else
|
|
351
|
-
value
|
|
352
|
-
end
|
|
353
|
-
end
|
|
354
354
|
end
|
|
355
355
|
end
|
|
356
356
|
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
|
|
4
|
+
# Provides behaviour for generating the selector for a specific document.
|
|
5
|
+
#
|
|
6
|
+
# @since 4.0.0
|
|
7
|
+
module Selectable
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
# Get the atomic selector for the document. This is a hash in the simplest
|
|
11
|
+
# case { "_id" => id }, but can become more complex for embedded documents
|
|
12
|
+
# and documents that use a shard key.
|
|
13
|
+
#
|
|
14
|
+
# @example Get the document's atomic selector.
|
|
15
|
+
# document.atomic_selector
|
|
16
|
+
#
|
|
17
|
+
# @return [ Hash ] The document's selector.
|
|
18
|
+
#
|
|
19
|
+
# @since 1.0.0
|
|
20
|
+
def atomic_selector
|
|
21
|
+
@atomic_selector ||=
|
|
22
|
+
(embedded? ? embedded_atomic_selector : root_atomic_selector)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
# Get the atomic selector for an embedded document.
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
#
|
|
31
|
+
# @example Get the embedded atomic selector.
|
|
32
|
+
# document.embedded_atomic_selector
|
|
33
|
+
#
|
|
34
|
+
# @return [ Hash ] The embedded document selector.
|
|
35
|
+
#
|
|
36
|
+
# @since 4.0.0
|
|
37
|
+
def embedded_atomic_selector
|
|
38
|
+
if persisted? && _id_changed?
|
|
39
|
+
_parent.atomic_selector
|
|
40
|
+
else
|
|
41
|
+
_parent.atomic_selector.merge("#{atomic_path}._id" => _id)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Get the atomic selector for a root document.
|
|
46
|
+
#
|
|
47
|
+
# @api private
|
|
48
|
+
#
|
|
49
|
+
# @example Get the root atomic selector.
|
|
50
|
+
# document.root_atomic_selector
|
|
51
|
+
#
|
|
52
|
+
# @return [ Hash ] The root document selector.
|
|
53
|
+
#
|
|
54
|
+
# @since 4.0.0
|
|
55
|
+
def root_atomic_selector
|
|
56
|
+
{ "_id" => _id }.merge!(shard_key_selector)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -3,9 +3,18 @@ module Mongoid
|
|
|
3
3
|
|
|
4
4
|
# This module provides the extra behaviour for including relations in JSON
|
|
5
5
|
# and XML serialization.
|
|
6
|
-
|
|
6
|
+
#
|
|
7
|
+
# @since 4.0.0
|
|
8
|
+
module Serializable
|
|
7
9
|
extend ActiveSupport::Concern
|
|
8
10
|
|
|
11
|
+
# We need to redefine where the JSON configuration is getting defined,
|
|
12
|
+
# similar to +ActiveRecord+.
|
|
13
|
+
included do
|
|
14
|
+
undef_method :include_root_in_json
|
|
15
|
+
delegate :include_root_in_json, to: ::Mongoid
|
|
16
|
+
end
|
|
17
|
+
|
|
9
18
|
# Gets the document as a serializable hash, used by ActiveModel's JSON
|
|
10
19
|
# serializer.
|
|
11
20
|
#
|
|
@@ -93,7 +102,7 @@ module Mongoid
|
|
|
93
102
|
attrs[name] = value ? value.serializable_hash(options) : nil
|
|
94
103
|
elsif names.include?(name) && !fields.has_key?(name)
|
|
95
104
|
attrs[name] = read_attribute(name)
|
|
96
|
-
|
|
105
|
+
elsif !attribute_missing?(name)
|
|
97
106
|
attrs[name] = send(name)
|
|
98
107
|
end
|
|
99
108
|
end
|
|
@@ -61,6 +61,8 @@ module Mongoid
|
|
|
61
61
|
raise Errors::NoSessionsConfig.new unless configuration
|
|
62
62
|
config, options = parse(configuration)
|
|
63
63
|
configuration.merge!(config) if configuration.delete(:uri)
|
|
64
|
+
|
|
65
|
+
options[:instrumenter] = ActiveSupport::Notifications
|
|
64
66
|
session = Moped::Session.new(config[:hosts], options)
|
|
65
67
|
session.use(config[:database])
|
|
66
68
|
if authenticated?(config)
|