mongoid 3.1.6 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +432 -8
- data/README.md +5 -6
- data/lib/config/locales/en.yml +32 -18
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/atomic.rb +1 -12
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/attributes.rb +63 -101
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +18 -6
- data/lib/mongoid/contextual/mongo.rb +64 -56
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/document.rb +32 -17
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/extensions.rb +2 -7
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/{finders.rb → findable.rb} +8 -2
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/persistable/creatable.rb +188 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +152 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +247 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations/accessors.rb +13 -49
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +1 -24
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +3 -1
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +30 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +19 -32
- data/lib/mongoid/relations/referenced/many_to_many.rb +15 -38
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +180 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/threaded.rb +0 -157
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +23 -19
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid.rb +10 -76
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +13 -24
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +335 -448
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +315 -436
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +68 -58
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +151 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1255 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +578 -2295
- data/spec/mongoid/document_spec.rb +166 -120
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +127 -27
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +461 -0
- data/spec/mongoid/persistable/settable_spec.rb +139 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +9 -9
- data/spec/mongoid/query_cache_spec.rb +231 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +393 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +434 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +352 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +20 -60
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +107 -0
- data/spec/mongoid/sessions_spec.rb +289 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +29 -13
- metadata +296 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
|
@@ -21,11 +21,11 @@ module Mongoid
|
|
|
21
21
|
size == 0
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
# Creates a new document on the references many relation. This will
|
|
25
|
+
# save the document if the parent has been persisted.
|
|
26
|
+
#
|
|
27
|
+
# @example Create and save the new document.
|
|
28
|
+
# person.posts.create(:text => "Testing")
|
|
29
29
|
#
|
|
30
30
|
# @overload create(attributes = nil, options = {}, type = nil)
|
|
31
31
|
# @param [ Hash ] attributes The attributes to create with.
|
|
@@ -39,10 +39,14 @@ module Mongoid
|
|
|
39
39
|
# @return [ Document ] The newly created document.
|
|
40
40
|
#
|
|
41
41
|
# @since 2.0.0.beta.1
|
|
42
|
-
def create(attributes = nil,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
def create(attributes = nil, type = nil, &block)
|
|
43
|
+
if attributes.is_a?(::Array)
|
|
44
|
+
attributes.map { |attrs| create(attrs, type, &block) }
|
|
45
|
+
else
|
|
46
|
+
doc = build(attributes, type, &block)
|
|
47
|
+
base.persisted? ? doc.save : raise_unsaved(doc)
|
|
48
|
+
doc
|
|
49
|
+
end
|
|
46
50
|
end
|
|
47
51
|
|
|
48
52
|
# Creates a new document on the references many relation. This will
|
|
@@ -54,7 +58,6 @@ module Mongoid
|
|
|
54
58
|
#
|
|
55
59
|
# @overload create!(attributes = nil, options = {}, type = nil)
|
|
56
60
|
# @param [ Hash ] attributes The attributes to create with.
|
|
57
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
58
61
|
# @param [ Class ] type The optional type of document to create.
|
|
59
62
|
#
|
|
60
63
|
# @overload create!(attributes = nil, type = nil)
|
|
@@ -66,10 +69,14 @@ module Mongoid
|
|
|
66
69
|
# @return [ Document ] The newly created document.
|
|
67
70
|
#
|
|
68
71
|
# @since 2.0.0.beta.1
|
|
69
|
-
def create!(attributes = nil,
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
72
|
+
def create!(attributes = nil, type = nil, &block)
|
|
73
|
+
if attributes.is_a?(::Array)
|
|
74
|
+
attributes.map { |attrs| create!(attrs, type, &block) }
|
|
75
|
+
else
|
|
76
|
+
doc = build(attributes, type, &block)
|
|
77
|
+
base.persisted? ? doc.save! : raise_unsaved(doc)
|
|
78
|
+
doc
|
|
79
|
+
end
|
|
73
80
|
end
|
|
74
81
|
|
|
75
82
|
# Find the first document given the conditions, or creates a new document
|
|
@@ -78,9 +85,8 @@ module Mongoid
|
|
|
78
85
|
# @example Find or create.
|
|
79
86
|
# person.posts.find_or_create_by(:title => "Testing")
|
|
80
87
|
#
|
|
81
|
-
# @overload find_or_create_by(attributes = nil,
|
|
88
|
+
# @overload find_or_create_by(attributes = nil, type = nil)
|
|
82
89
|
# @param [ Hash ] attributes The attributes to search or create with.
|
|
83
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
84
90
|
# @param [ Class ] type The optional type of document to create.
|
|
85
91
|
#
|
|
86
92
|
# @overload find_or_create_by(attributes = nil, type = nil)
|
|
@@ -88,8 +94,8 @@ module Mongoid
|
|
|
88
94
|
# @param [ Class ] type The optional type of document to create.
|
|
89
95
|
#
|
|
90
96
|
# @return [ Document ] An existing document or newly created one.
|
|
91
|
-
def find_or_create_by(attrs = {},
|
|
92
|
-
find_or(:create, attrs,
|
|
97
|
+
def find_or_create_by(attrs = {}, type = nil, &block)
|
|
98
|
+
find_or(:create, attrs, type, &block)
|
|
93
99
|
end
|
|
94
100
|
|
|
95
101
|
# Find the first +Document+ given the conditions, or instantiates a new document
|
|
@@ -98,9 +104,8 @@ module Mongoid
|
|
|
98
104
|
# @example Find or initialize.
|
|
99
105
|
# person.posts.find_or_initialize_by(:title => "Test")
|
|
100
106
|
#
|
|
101
|
-
# @overload find_or_initialize_by(attributes = {},
|
|
107
|
+
# @overload find_or_initialize_by(attributes = {}, type = nil)
|
|
102
108
|
# @param [ Hash ] attributes The attributes to search or initialize with.
|
|
103
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
104
109
|
# @param [ Class ] type The optional subclass to build.
|
|
105
110
|
#
|
|
106
111
|
# @overload find_or_initialize_by(attributes = {}, type = nil)
|
|
@@ -108,8 +113,8 @@ module Mongoid
|
|
|
108
113
|
# @param [ Class ] type The optional subclass to build.
|
|
109
114
|
#
|
|
110
115
|
# @return [ Document ] An existing document or newly instantiated one.
|
|
111
|
-
def find_or_initialize_by(attrs = {},
|
|
112
|
-
find_or(:build, attrs,
|
|
116
|
+
def find_or_initialize_by(attrs = {}, type = nil, &block)
|
|
117
|
+
find_or(:build, attrs, type, &block)
|
|
113
118
|
end
|
|
114
119
|
|
|
115
120
|
# This proxy can never be nil.
|
|
@@ -191,10 +196,9 @@ module Mongoid
|
|
|
191
196
|
# @example Find or create|initialize.
|
|
192
197
|
# person.addresses.find_or(:create, :street => "Bond")
|
|
193
198
|
#
|
|
194
|
-
# @overload find_or(method, attributes = {},
|
|
199
|
+
# @overload find_or(method, attributes = {}, type = nil)
|
|
195
200
|
# @param [ Symbol ] method The method name, create or new.
|
|
196
201
|
# @param [ Hash ] attributes The attributes to search or build with.
|
|
197
|
-
# @param [ Hash ] options The scoped assignment options.
|
|
198
202
|
# @param [ Class ] type The optional subclass to build.
|
|
199
203
|
#
|
|
200
204
|
# @overload find_or(attributes = {}, type = nil)
|
|
@@ -203,14 +207,9 @@ module Mongoid
|
|
|
203
207
|
# @param [ Class ] type The optional subclass to build.
|
|
204
208
|
#
|
|
205
209
|
# @return [ Document ] A matching document or a new/created one.
|
|
206
|
-
def find_or(method, attrs = {},
|
|
207
|
-
if options.is_a? Class
|
|
208
|
-
options, type = {}, options
|
|
209
|
-
end
|
|
210
|
-
|
|
210
|
+
def find_or(method, attrs = {}, type = nil, &block)
|
|
211
211
|
attrs["_type"] = type.to_s if type
|
|
212
|
-
|
|
213
|
-
where(attrs).first || send(method, attrs, options, type, &block)
|
|
212
|
+
where(attrs).first || send(method, attrs, type, &block)
|
|
214
213
|
end
|
|
215
214
|
end
|
|
216
215
|
end
|
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
|
12
12
|
#
|
|
13
13
|
# @since 3.0.15
|
|
14
14
|
def marshal_dump
|
|
15
|
-
[ base, target,
|
|
15
|
+
[ base, target, __metadata ]
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
# Takes the provided data and sets it back on the proxy.
|
|
@@ -24,8 +24,8 @@ module Mongoid
|
|
|
24
24
|
#
|
|
25
25
|
# @since 3.0.15
|
|
26
26
|
def marshal_load(data)
|
|
27
|
-
@base, @target, @
|
|
28
|
-
extend_proxy(
|
|
27
|
+
@base, @target, @__metadata = data
|
|
28
|
+
extend_proxy(__metadata.extension) if __metadata.extension?
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -229,20 +229,6 @@ module Mongoid
|
|
|
229
229
|
!!dependent
|
|
230
230
|
end
|
|
231
231
|
|
|
232
|
-
# Get the criteria needed to eager load this relation.
|
|
233
|
-
#
|
|
234
|
-
# @example Get the eager loading criteria.
|
|
235
|
-
# metadata.eager_load(criteria)
|
|
236
|
-
#
|
|
237
|
-
# @param [ Array<Object> ] ids The ids of the returned parents.
|
|
238
|
-
#
|
|
239
|
-
# @return [ Criteria ] The eager loading criteria.
|
|
240
|
-
#
|
|
241
|
-
# @since 2.2.0
|
|
242
|
-
def eager_load(ids)
|
|
243
|
-
relation.eager_load(self, ids)
|
|
244
|
-
end
|
|
245
|
-
|
|
246
232
|
# Will determine if the relation is an embedded one or not. Currently
|
|
247
233
|
# only checks against embeds one and many.
|
|
248
234
|
#
|
|
@@ -398,8 +384,7 @@ module Mongoid
|
|
|
398
384
|
order: #{order.inspect}
|
|
399
385
|
polymorphic: #{polymorphic?}
|
|
400
386
|
relation: #{relation}
|
|
401
|
-
setter: #{setter}
|
|
402
|
-
versioned: #{versioned?}>
|
|
387
|
+
setter: #{setter}>
|
|
403
388
|
}
|
|
404
389
|
end
|
|
405
390
|
|
|
@@ -460,21 +445,6 @@ module Mongoid
|
|
|
460
445
|
!!inverse_class_name
|
|
461
446
|
end
|
|
462
447
|
|
|
463
|
-
# Is the inverse field bindable? Ie, do we have more than one definition
|
|
464
|
-
# on the parent class with the same polymorphic name (as).
|
|
465
|
-
#
|
|
466
|
-
# @example Is the inverse of bindable?
|
|
467
|
-
# metadata.inverse_of_bindable?
|
|
468
|
-
#
|
|
469
|
-
# @return [ true, false ] If the relation needs the inverse of field set.
|
|
470
|
-
#
|
|
471
|
-
# @since 3.0.6
|
|
472
|
-
def inverse_field_bindable?
|
|
473
|
-
@inverse_field_bindable ||= (inverse_klass.relations.values.count do |meta|
|
|
474
|
-
meta.as == as
|
|
475
|
-
end > 1)
|
|
476
|
-
end
|
|
477
|
-
|
|
478
448
|
# Used for relational many to many only. This determines the name of the
|
|
479
449
|
# foreign key field on the inverse side of the relation, since in this
|
|
480
450
|
# case there are keys on both sides.
|
|
@@ -579,31 +549,6 @@ module Mongoid
|
|
|
579
549
|
@inverse_type_setter ||= inverse_type.__setter__
|
|
580
550
|
end
|
|
581
551
|
|
|
582
|
-
# Returns the name of the field in which to store the name of the inverse
|
|
583
|
-
# field for the polymorphic relation.
|
|
584
|
-
#
|
|
585
|
-
# @example Get the name of the field.
|
|
586
|
-
# metadata.inverse_of_field
|
|
587
|
-
#
|
|
588
|
-
# @return [ String ] The name of the field for storing the name of the
|
|
589
|
-
# inverse field.
|
|
590
|
-
#
|
|
591
|
-
# @since 2.4.5
|
|
592
|
-
def inverse_of_field
|
|
593
|
-
@inverse_of_field ||= determine_inverse_for(:field)
|
|
594
|
-
end
|
|
595
|
-
|
|
596
|
-
# Gets the setter for the field that stores the name of the inverse field
|
|
597
|
-
# on a polymorphic relation.
|
|
598
|
-
#
|
|
599
|
-
# @example Get the inverse type setter.
|
|
600
|
-
# metadata.inverse_of_field_setter
|
|
601
|
-
#
|
|
602
|
-
# @return [ String ] The name of the setter.
|
|
603
|
-
def inverse_of_field_setter
|
|
604
|
-
@inverse_of_field_setter ||= inverse_of_field.__setter__
|
|
605
|
-
end
|
|
606
|
-
|
|
607
552
|
# This returns the key that is to be used to grab the attributes for the
|
|
608
553
|
# relation or the foreign key or id that a referenced relation will use
|
|
609
554
|
# to query for the object.
|
|
@@ -823,18 +768,6 @@ module Mongoid
|
|
|
823
768
|
end
|
|
824
769
|
end
|
|
825
770
|
|
|
826
|
-
# Is this relation using Mongoid's internal versioning system?
|
|
827
|
-
#
|
|
828
|
-
# @example Is this relation versioned?
|
|
829
|
-
# metadata.versioned?
|
|
830
|
-
#
|
|
831
|
-
# @return [ true, false ] If the relation uses Mongoid versioning.
|
|
832
|
-
#
|
|
833
|
-
# @since 2.1.0
|
|
834
|
-
def versioned?
|
|
835
|
-
!!self[:versioned]
|
|
836
|
-
end
|
|
837
|
-
|
|
838
771
|
# Returns the metadata itself. Here for compatibility with Rails
|
|
839
772
|
# association metadata.
|
|
840
773
|
#
|
|
@@ -977,9 +910,13 @@ module Mongoid
|
|
|
977
910
|
# @since 3.0.0
|
|
978
911
|
def find_from_parts(modules)
|
|
979
912
|
modules.find do |mod|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
913
|
+
if mod.blank?
|
|
914
|
+
false
|
|
915
|
+
else
|
|
916
|
+
ActiveSupport::Inflector.constantize(mod).constants.include?(
|
|
917
|
+
name.to_s.classify.to_sym
|
|
918
|
+
)
|
|
919
|
+
end
|
|
983
920
|
end
|
|
984
921
|
end
|
|
985
922
|
|
|
@@ -1033,15 +970,13 @@ module Mongoid
|
|
|
1033
970
|
# @since 2.0.0.rc.1
|
|
1034
971
|
def determine_foreign_key
|
|
1035
972
|
return self[:foreign_key].to_s if self[:foreign_key]
|
|
1036
|
-
|
|
973
|
+
return nil if relation.embedded?
|
|
974
|
+
|
|
1037
975
|
if relation.stores_foreign_key?
|
|
1038
976
|
relation.foreign_key(name)
|
|
1039
977
|
else
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
else
|
|
1043
|
-
inverse_of ? "#{inverse_of}#{suffix}" : inverse_class_name.foreign_key
|
|
1044
|
-
end
|
|
978
|
+
suffix = relation.foreign_key_suffix
|
|
979
|
+
"#{inverse}#{suffix}"
|
|
1045
980
|
end
|
|
1046
981
|
end
|
|
1047
982
|
|
|
@@ -1112,8 +1047,8 @@ module Mongoid
|
|
|
1112
1047
|
# @since 3.0.0
|
|
1113
1048
|
def inverse_relation_candidates
|
|
1114
1049
|
relations_metadata.select do |meta|
|
|
1115
|
-
next if meta.
|
|
1116
|
-
meta.class_name == inverse_class_name
|
|
1050
|
+
next if meta.name == name
|
|
1051
|
+
(meta.class_name == inverse_class_name) && !meta.forced_nil_inverse?
|
|
1117
1052
|
end
|
|
1118
1053
|
end
|
|
1119
1054
|
|
|
@@ -63,11 +63,11 @@ module Mongoid
|
|
|
63
63
|
# @param [ Class ] klass The class we're trying to convert for.
|
|
64
64
|
# @param [ String ] id The id, usually coming from the form.
|
|
65
65
|
#
|
|
66
|
-
# @return [
|
|
66
|
+
# @return [ BSON::ObjectId, String, Object ] The converted id.
|
|
67
67
|
#
|
|
68
68
|
# @since 2.0.0.rc.6
|
|
69
69
|
def convert_id(klass, id)
|
|
70
|
-
klass.using_object_ids? ?
|
|
70
|
+
klass.using_object_ids? ? BSON::ObjectId.mongoize(id) : id
|
|
71
71
|
end
|
|
72
72
|
end
|
|
73
73
|
end
|
|
@@ -12,16 +12,17 @@ module Mongoid
|
|
|
12
12
|
# We undefine most methods to get them sent through to the target.
|
|
13
13
|
instance_methods.each do |method|
|
|
14
14
|
undef_method(method) unless
|
|
15
|
-
method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy)/
|
|
15
|
+
method =~ /(^__|^send|^object_id|^respond_to|^tap|extend_proxy|extend_proxies)/
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
include Threaded::Lifecycle
|
|
19
19
|
include Marshalable
|
|
20
20
|
|
|
21
|
-
attr_accessor :base, :
|
|
21
|
+
attr_accessor :base, :__metadata, :target
|
|
22
|
+
alias :relation_metadata :__metadata
|
|
22
23
|
|
|
23
24
|
# Backwards compatibility with Mongoid beta releases.
|
|
24
|
-
delegate :foreign_key, :inverse_foreign_key, to: :
|
|
25
|
+
delegate :foreign_key, :inverse_foreign_key, to: :__metadata
|
|
25
26
|
delegate :bind_one, :unbind_one, to: :binding
|
|
26
27
|
delegate :collection_name, to: :base
|
|
27
28
|
|
|
@@ -37,9 +38,14 @@ module Mongoid
|
|
|
37
38
|
#
|
|
38
39
|
# @since 2.0.0.rc.1
|
|
39
40
|
def init(base, target, metadata)
|
|
40
|
-
@base, @target, @
|
|
41
|
+
@base, @target, @__metadata = base, target, metadata
|
|
41
42
|
yield(self) if block_given?
|
|
42
|
-
|
|
43
|
+
extend_proxies(metadata.extension) if metadata.extension?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Allow extension to be an array and extend each module
|
|
47
|
+
def extend_proxies(*extension)
|
|
48
|
+
extension.flatten.each {|ext| extend_proxy(ext) }
|
|
43
49
|
end
|
|
44
50
|
|
|
45
51
|
# Get the class from the metadata, or return nil if no metadata present.
|
|
@@ -51,7 +57,7 @@ module Mongoid
|
|
|
51
57
|
#
|
|
52
58
|
# @since 3.0.15
|
|
53
59
|
def klass
|
|
54
|
-
|
|
60
|
+
__metadata ? __metadata.klass : nil
|
|
55
61
|
end
|
|
56
62
|
|
|
57
63
|
# Resets the criteria inside the relation proxy. Used by many to many
|
|
@@ -103,7 +109,7 @@ module Mongoid
|
|
|
103
109
|
#
|
|
104
110
|
# @since 3.0.0
|
|
105
111
|
def with(options)
|
|
106
|
-
|
|
112
|
+
@persistence_options = options
|
|
107
113
|
self
|
|
108
114
|
end
|
|
109
115
|
|
|
@@ -119,6 +125,7 @@ module Mongoid
|
|
|
119
125
|
# @since 2.0.0
|
|
120
126
|
def collection
|
|
121
127
|
root = base._root
|
|
128
|
+
root.with(@persistence_options)
|
|
122
129
|
root.collection unless root.embedded?
|
|
123
130
|
end
|
|
124
131
|
|
|
@@ -131,7 +138,7 @@ module Mongoid
|
|
|
131
138
|
#
|
|
132
139
|
# @since 2.0.0.rc.4
|
|
133
140
|
def characterize_one(document)
|
|
134
|
-
document.
|
|
141
|
+
document.__metadata = __metadata unless document.__metadata
|
|
135
142
|
end
|
|
136
143
|
|
|
137
144
|
# Default behavior of method missing should be to delegate all calls
|
|
@@ -153,7 +160,7 @@ module Mongoid
|
|
|
153
160
|
#
|
|
154
161
|
# @since 2.0.0
|
|
155
162
|
def raise_mixed
|
|
156
|
-
raise Errors::MixedRelations.new(base.class,
|
|
163
|
+
raise Errors::MixedRelations.new(base.class, __metadata.klass)
|
|
157
164
|
end
|
|
158
165
|
|
|
159
166
|
# When the base is not yet saved and the user calls create or create!
|
|
@@ -183,11 +190,12 @@ module Mongoid
|
|
|
183
190
|
# @since 3.1.0
|
|
184
191
|
def callback_method(callback_name)
|
|
185
192
|
methods = []
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
193
|
+
metadata = __metadata[callback_name]
|
|
194
|
+
if metadata
|
|
195
|
+
if metadata.is_a?(Array)
|
|
196
|
+
methods.concat(metadata)
|
|
189
197
|
else
|
|
190
|
-
methods << metadata
|
|
198
|
+
methods << metadata
|
|
191
199
|
end
|
|
192
200
|
end
|
|
193
201
|
methods
|
|
@@ -230,34 +238,6 @@ module Mongoid
|
|
|
230
238
|
def apply_ordering(criteria, metadata)
|
|
231
239
|
metadata.order ? criteria.order_by(metadata.order) : criteria
|
|
232
240
|
end
|
|
233
|
-
|
|
234
|
-
# Get the criteria that is used to eager load a relation of this
|
|
235
|
-
# type.
|
|
236
|
-
#
|
|
237
|
-
# @example Get the eager load criteria.
|
|
238
|
-
# Proxy.eager_load(metadata, criteria)
|
|
239
|
-
#
|
|
240
|
-
# @param [ Metadata ] metadata The relation metadata.
|
|
241
|
-
# @param [ Array<Object> ] ids The ids of the base docs.
|
|
242
|
-
#
|
|
243
|
-
# @return [ Criteria ] The criteria to eager load the relation.
|
|
244
|
-
#
|
|
245
|
-
# @since 2.2.0
|
|
246
|
-
def eager_load_ids(metadata, ids)
|
|
247
|
-
klass, foreign_key = metadata.klass, metadata.foreign_key
|
|
248
|
-
eager_loaded = klass.any_in(foreign_key => ids).entries
|
|
249
|
-
ids.each do |id|
|
|
250
|
-
sel = { foreign_key => id }
|
|
251
|
-
sel.merge!(metadata.type_relation) if klass.hereditary?
|
|
252
|
-
IdentityMap.clear_many(klass, sel)
|
|
253
|
-
end
|
|
254
|
-
eager_loaded.each do |doc|
|
|
255
|
-
base_id = doc.__send__(foreign_key)
|
|
256
|
-
sel = { foreign_key => base_id }
|
|
257
|
-
sel.merge!(metadata.type_relation) if klass.hereditary?
|
|
258
|
-
yield(doc, sel)
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
241
|
end
|
|
262
242
|
end
|
|
263
243
|
end
|
|
@@ -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
|
|
@@ -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.id,
|
|
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,7 +486,7 @@ 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)
|
|
@@ -497,7 +495,7 @@ module Mongoid
|
|
|
497
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
|