mongoid 3.1.6 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +479 -8
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- data/lib/mongoid.rb +10 -76
- data/lib/mongoid/atomic.rb +3 -14
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- 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/root.rb +0 -13
- data/lib/mongoid/attributes.rb +65 -101
- 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/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
- 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 +23 -11
- data/lib/mongoid/contextual/mongo.rb +75 -57
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/criteria/#findable.rb# +141 -0
- 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/document.rb +39 -24
- data/lib/mongoid/errors.rb +4 -1
- 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/extensions.rb +15 -7
- 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/factory.rb +8 -6
- data/lib/mongoid/fields.rb +41 -8
- 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/{finders.rb → findable.rb} +35 -7
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- 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/matchable.rb +152 -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/persistable.rb +216 -0
- data/lib/mongoid/persistable/creatable.rb +189 -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 +153 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +255 -0
- data/lib/mongoid/railtie.rb +34 -60
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/relations/accessors.rb +15 -51
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +2 -25
- 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 +4 -2
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
- 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/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.rb +46 -0
- 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/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 +51 -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/one.rb +1 -1
- 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 +22 -35
- data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +4 -4
- data/lib/mongoid/relations/targets/enumerable.rb +10 -10
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
- 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.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +185 -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/{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.rb +26 -172
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- 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 +25 -21
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
- 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/contextable_item.rb +5 -0
- 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/id_key.rb +6 -0
- 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_spec.rb# +365 -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} +474 -592
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +349 -434
- 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 +60 -56
- 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 +156 -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 +1252 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +715 -2421
- data/spec/mongoid/document_spec.rb +171 -121
- 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 +29 -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/findable_spec.rb +509 -0
- 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 +553 -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 +498 -0
- data/spec/mongoid/persistable/settable_spec.rb +162 -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} +14 -19
- data/spec/mongoid/query_cache_spec.rb +263 -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 +467 -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 +587 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -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} +38 -55
- 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 +108 -0
- data/spec/mongoid/sessions_spec.rb +319 -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 +31 -13
- metadata +303 -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.rb +0 -32
- data/lib/mongoid/matchers/strategies.rb +0 -97
- 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.rb +0 -357
- data/lib/mongoid/persistence/atomic.rb +0 -231
- 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/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.rb +0 -214
- 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/upsertion.rb +0 -31
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- 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/finders_spec.rb +0 -321
- 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
@@ -71,7 +71,7 @@ module Mongoid
|
|
71
71
|
#
|
72
72
|
# @since 2.0.0.rc.1
|
73
73
|
def binding
|
74
|
-
Bindings::Referenced::In.new(base, target,
|
74
|
+
Bindings::Referenced::In.new(base, target, __metadata)
|
75
75
|
end
|
76
76
|
|
77
77
|
# Normalize the value provided as a replacement for substitution.
|
@@ -88,7 +88,7 @@ module Mongoid
|
|
88
88
|
# @since 3.1.5
|
89
89
|
def normalize(replacement)
|
90
90
|
return replacement if replacement.is_a?(Document)
|
91
|
-
|
91
|
+
__metadata.builder(klass, replacement).build
|
92
92
|
end
|
93
93
|
|
94
94
|
# Are we able to persist this relation?
|
@@ -139,24 +139,8 @@ module Mongoid
|
|
139
139
|
type.where(metadata.primary_key => object)
|
140
140
|
end
|
141
141
|
|
142
|
-
|
143
|
-
|
144
|
-
#
|
145
|
-
# @example Get the eager load criteria.
|
146
|
-
# Proxy.eager_load(metadata, criteria)
|
147
|
-
#
|
148
|
-
# @param [ Metadata ] metadata The relation metadata.
|
149
|
-
# @param [ Array<Object> ] ids The ids of the target docs.
|
150
|
-
#
|
151
|
-
# @return [ Criteria ] The criteria to eager load the relation.
|
152
|
-
#
|
153
|
-
# @since 2.2.0
|
154
|
-
def eager_load(metadata, ids)
|
155
|
-
raise Errors::EagerLoad.new(metadata.name) if metadata.polymorphic?
|
156
|
-
klass, _ = metadata.klass, metadata.foreign_key
|
157
|
-
klass.any_in("_id" => ids.uniq).each do |doc|
|
158
|
-
IdentityMap.set(doc)
|
159
|
-
end
|
142
|
+
def eager_load_klass
|
143
|
+
Relations::Eager::BelongsTo
|
160
144
|
end
|
161
145
|
|
162
146
|
# Returns true if the relation is an embedded one. In this case
|
@@ -78,12 +78,8 @@ module Mongoid
|
|
78
78
|
# @return [ Document ] The new document.
|
79
79
|
#
|
80
80
|
# @since 2.0.0.beta.1
|
81
|
-
def build(attributes = {},
|
82
|
-
|
83
|
-
options, type = {}, options
|
84
|
-
end
|
85
|
-
|
86
|
-
doc = Factory.build(type || klass, attributes, options)
|
81
|
+
def build(attributes = {}, type = nil)
|
82
|
+
doc = Factory.build(type || klass, attributes)
|
87
83
|
append(doc)
|
88
84
|
doc.apply_post_processed_defaults
|
89
85
|
yield(doc) if block_given?
|
@@ -186,15 +182,15 @@ module Mongoid
|
|
186
182
|
# conditions.
|
187
183
|
#
|
188
184
|
# @example Find by an id.
|
189
|
-
# person.posts.find(
|
185
|
+
# person.posts.find(BSON::ObjectId.new)
|
190
186
|
#
|
191
187
|
# @example Find by multiple ids.
|
192
|
-
# person.posts.find([
|
188
|
+
# person.posts.find([ BSON::ObjectId.new, BSON::ObjectId.new ])
|
193
189
|
#
|
194
190
|
# @note This will keep matching documents in memory for iteration
|
195
191
|
# later.
|
196
192
|
#
|
197
|
-
# @param [
|
193
|
+
# @param [ BSON::ObjectId, Array<BSON::ObjectId> ] arg The ids.
|
198
194
|
#
|
199
195
|
# @return [ Document, Criteria ] The matching document(s).
|
200
196
|
#
|
@@ -249,7 +245,7 @@ module Mongoid
|
|
249
245
|
#
|
250
246
|
# @since 2.0.0.beta.1
|
251
247
|
def purge
|
252
|
-
unless
|
248
|
+
unless __metadata.destructive?
|
253
249
|
nullify
|
254
250
|
else
|
255
251
|
after_remove_error = nil
|
@@ -285,10 +281,10 @@ module Mongoid
|
|
285
281
|
def substitute(replacement)
|
286
282
|
if replacement
|
287
283
|
new_docs, docs = replacement.compact, []
|
288
|
-
new_ids = new_docs.map { |doc| doc.
|
284
|
+
new_ids = new_docs.map { |doc| doc._id }
|
289
285
|
remove_not_in(new_ids)
|
290
286
|
new_docs.each do |doc|
|
291
|
-
docs.push(doc) if doc.send(foreign_key) != base.
|
287
|
+
docs.push(doc) if doc.send(foreign_key) != base._id
|
292
288
|
end
|
293
289
|
concat(docs)
|
294
290
|
else
|
@@ -308,7 +304,7 @@ module Mongoid
|
|
308
304
|
# @since 2.4.0
|
309
305
|
def unscoped
|
310
306
|
klass.unscoped.where(
|
311
|
-
foreign_key => Conversions.flag(base.
|
307
|
+
foreign_key => Conversions.flag(base._id, __metadata)
|
312
308
|
)
|
313
309
|
end
|
314
310
|
|
@@ -324,6 +320,8 @@ module Mongoid
|
|
324
320
|
#
|
325
321
|
# @since 2.0.0.rc.1
|
326
322
|
def append(document)
|
323
|
+
document.with(@persistence_options) if @persistence_options
|
324
|
+
|
327
325
|
execute_callback :before_add, document
|
328
326
|
target.push(document)
|
329
327
|
characterize_one(document)
|
@@ -342,7 +340,7 @@ module Mongoid
|
|
342
340
|
#
|
343
341
|
# @since 2.0.0.rc.1
|
344
342
|
def binding
|
345
|
-
Bindings::Referenced::Many.new(base, target,
|
343
|
+
Bindings::Referenced::Many.new(base, target, __metadata)
|
346
344
|
end
|
347
345
|
|
348
346
|
# Get the collection of the relation in question.
|
@@ -368,8 +366,8 @@ module Mongoid
|
|
368
366
|
# @since 2.0.0.beta.1
|
369
367
|
def criteria
|
370
368
|
Many.criteria(
|
371
|
-
|
372
|
-
Conversions.flag(base.send(
|
369
|
+
__metadata,
|
370
|
+
Conversions.flag(base.send(__metadata.primary_key), __metadata),
|
373
371
|
base.class
|
374
372
|
)
|
375
373
|
end
|
@@ -387,8 +385,8 @@ module Mongoid
|
|
387
385
|
# @since 2.1.0
|
388
386
|
def cascade!(document)
|
389
387
|
if persistable?
|
390
|
-
if
|
391
|
-
document.send(
|
388
|
+
if __metadata.destructive?
|
389
|
+
document.send(__metadata.dependent)
|
392
390
|
else
|
393
391
|
document.save
|
394
392
|
end
|
@@ -412,7 +410,7 @@ module Mongoid
|
|
412
410
|
target.send(name, *args, &block)
|
413
411
|
else
|
414
412
|
klass.send(:with_scope, criteria) do
|
415
|
-
criteria.
|
413
|
+
criteria.public_send(name, *args, &block)
|
416
414
|
end
|
417
415
|
end
|
418
416
|
end
|
@@ -488,16 +486,16 @@ module Mongoid
|
|
488
486
|
# @since 2.4.0
|
489
487
|
def remove_not_in(ids)
|
490
488
|
removed = criteria.not_in(_id: ids)
|
491
|
-
if
|
489
|
+
if __metadata.destructive?
|
492
490
|
removed.delete_all
|
493
491
|
else
|
494
492
|
removed.update_all(foreign_key => nil)
|
495
493
|
end
|
496
494
|
in_memory.each do |doc|
|
497
|
-
if !ids.include?(doc.
|
495
|
+
if !ids.include?(doc._id)
|
498
496
|
unbind_one(doc)
|
499
497
|
target.delete(doc)
|
500
|
-
if
|
498
|
+
if __metadata.destructive?
|
501
499
|
doc.destroyed = true
|
502
500
|
end
|
503
501
|
end
|
@@ -571,19 +569,8 @@ module Mongoid
|
|
571
569
|
)
|
572
570
|
end
|
573
571
|
|
574
|
-
|
575
|
-
|
576
|
-
# @example Eager load the criteria.
|
577
|
-
# Proxy.eager_load(metadata, criteria)
|
578
|
-
#
|
579
|
-
# @param [ Metadata ] metadata The relation metadata.
|
580
|
-
# @param [ Array<Object> ] ids The ids of the base docs.
|
581
|
-
#
|
582
|
-
# @return [ Criteria ] The criteria to eager load the relation.
|
583
|
-
#
|
584
|
-
# @since 2.2.0
|
585
|
-
def eager_load(metadata, ids)
|
586
|
-
eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_many(doc, key) }
|
572
|
+
def eager_load_klass
|
573
|
+
Relations::Eager::HasMany
|
587
574
|
end
|
588
575
|
|
589
576
|
# Returns true if the relation is an embedded one. In this case
|
@@ -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
|
@@ -55,17 +55,17 @@ module Mongoid
|
|
55
55
|
next unless doc
|
56
56
|
append(doc)
|
57
57
|
if persistable? || _creating?
|
58
|
-
ids[doc.
|
58
|
+
ids[doc._id] = true
|
59
59
|
save_or_delay(doc, docs, inserts)
|
60
60
|
else
|
61
61
|
existing = base.send(foreign_key)
|
62
|
-
unless existing.include?(doc.
|
63
|
-
existing.push(doc.
|
62
|
+
unless existing.include?(doc._id)
|
63
|
+
existing.push(doc._id) and unsynced(base, foreign_key)
|
64
64
|
end
|
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,26 +77,20 @@ 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
|
-
|
96
|
-
end
|
97
|
-
|
98
|
-
doc = Factory.build(type || klass, attributes, options)
|
99
|
-
base.send(foreign_key).push(doc.id)
|
91
|
+
def build(attributes = {}, type = nil)
|
92
|
+
doc = Factory.build(type || klass, attributes)
|
93
|
+
base.send(foreign_key).push(doc._id)
|
100
94
|
append(doc)
|
101
95
|
doc.apply_post_processed_defaults
|
102
96
|
unsynced(doc, inverse_foreign_key)
|
@@ -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
|
|
@@ -87,15 +87,15 @@ module Mongoid
|
|
87
87
|
# had occurred.
|
88
88
|
if meta.autosave?
|
89
89
|
send(meta.name).in_memory.each do |doc|
|
90
|
-
adds.delete_one(doc.
|
90
|
+
adds.delete_one(doc._id)
|
91
91
|
end
|
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
|
@@ -59,7 +59,7 @@ module Mongoid
|
|
59
59
|
#
|
60
60
|
# @since 2.1.0
|
61
61
|
def <<(document)
|
62
|
-
_added[document.
|
62
|
+
_added[document._id] = document
|
63
63
|
self
|
64
64
|
end
|
65
65
|
alias :push :<<
|
@@ -110,9 +110,9 @@ module Mongoid
|
|
110
110
|
#
|
111
111
|
# @since 2.1.0
|
112
112
|
def delete(document)
|
113
|
-
doc = (_loaded.delete(document.
|
113
|
+
doc = (_loaded.delete(document._id) || _added.delete(document._id))
|
114
114
|
unless doc
|
115
|
-
if _unloaded && _unloaded.where(_id: document.
|
115
|
+
if _unloaded && _unloaded.where(_id: document._id).exists?
|
116
116
|
yield(document) if block_given?
|
117
117
|
return document
|
118
118
|
end
|
@@ -128,7 +128,7 @@ module Mongoid
|
|
128
128
|
#
|
129
129
|
# @example Delete all matching documents.
|
130
130
|
# enumerable.delete_if do |doc|
|
131
|
-
# dod.
|
131
|
+
# dod._id == _id
|
132
132
|
# end
|
133
133
|
#
|
134
134
|
# @return [ Array<Document> ] The remaining docs.
|
@@ -138,8 +138,8 @@ module Mongoid
|
|
138
138
|
load_all!
|
139
139
|
deleted = in_memory.select(&block)
|
140
140
|
deleted.each do |doc|
|
141
|
-
_loaded.delete(doc.
|
142
|
-
_added.delete(doc.
|
141
|
+
_loaded.delete(doc._id)
|
142
|
+
_added.delete(doc._id)
|
143
143
|
end
|
144
144
|
self
|
145
145
|
end
|
@@ -179,8 +179,8 @@ module Mongoid
|
|
179
179
|
end
|
180
180
|
else
|
181
181
|
unloaded_documents.each do |doc|
|
182
|
-
document = _added.delete(doc.
|
183
|
-
_loaded[document.
|
182
|
+
document = _added.delete(doc._id) || _loaded.delete(doc._id) || doc
|
183
|
+
_loaded[document._id] = document
|
184
184
|
yield(document)
|
185
185
|
end
|
186
186
|
end
|
@@ -237,7 +237,7 @@ module Mongoid
|
|
237
237
|
else
|
238
238
|
@_added, @executed = {}, true
|
239
239
|
@_loaded = target.inject({}) do |_target, doc|
|
240
|
-
_target[doc.
|
240
|
+
_target[doc._id] = doc
|
241
241
|
_target
|
242
242
|
end
|
243
243
|
end
|
@@ -255,7 +255,7 @@ module Mongoid
|
|
255
255
|
# @since 3.0.0
|
256
256
|
def include?(doc)
|
257
257
|
return super unless _unloaded
|
258
|
-
_unloaded.where(_id: doc.
|
258
|
+
_unloaded.where(_id: doc._id).exists? || _added.has_key?(doc._id)
|
259
259
|
end
|
260
260
|
|
261
261
|
# Inspection will just inspect the entries for nice array-style
|