mongoid 3.1.7 → 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 +470 -9
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- 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 +3 -14
- 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 -99
- 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/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -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/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 +39 -24
- 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 +15 -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} +35 -7
- 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 +1 -1
- 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 +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/persistable.rb +216 -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/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/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/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 +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/relations.rb +11 -25
- 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/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/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 +26 -172
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- 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/{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 +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/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/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 +334 -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 +46 -38
- data/spec/mongoid/contextual/atomic_spec.rb +59 -55
- 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 +713 -2419
- 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/{matchers → matchable}/ne_spec.rb +3 -3
- 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} +9 -9
- 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 -350
- data/spec/spec_helper.rb +26 -15
- metadata +262 -247
- 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/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/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
|
@@ -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
|
|
@@ -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
|
|
@@ -18,14 +21,13 @@ module Mongoid
|
|
|
18
21
|
def reload
|
|
19
22
|
reloaded = _reload
|
|
20
23
|
if Mongoid.raise_not_found_error && reloaded.empty?
|
|
21
|
-
raise Errors::DocumentNotFound.new(self.class,
|
|
24
|
+
raise Errors::DocumentNotFound.new(self.class, _id, _id)
|
|
22
25
|
end
|
|
23
26
|
@attributes = reloaded
|
|
24
27
|
@attributes_before_type_cast = {}
|
|
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
|
|