mongoid 3.1.6 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +479 -8
- data/README.md +10 -7
- data/lib/config/locales/en.yml +34 -20
- data/lib/mongoid.rb +10 -76
- data/lib/mongoid/atomic.rb +3 -14
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/embedded/many.rb +1 -1
- data/lib/mongoid/atomic/paths/embedded/one.rb +1 -1
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +65 -101
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +13 -66
- data/lib/mongoid/{dirty.rb → changeable.rb} +32 -2
- data/lib/mongoid/composable.rb +105 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual.rb +2 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +2 -2
- data/lib/mongoid/contextual/aggregable/mongo.rb +7 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/geo_near.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +4 -2
- data/lib/mongoid/contextual/memory.rb +23 -11
- data/lib/mongoid/contextual/mongo.rb +75 -57
- data/lib/mongoid/contextual/none.rb +90 -0
- data/lib/mongoid/contextual/text_search.rb +178 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +39 -34
- data/lib/mongoid/criteria/#findable.rb# +141 -0
- data/lib/mongoid/{criterion → criteria}/findable.rb +7 -47
- data/lib/mongoid/{criterion/inspection.rb → criteria/inspectable.rb} +2 -2
- data/lib/mongoid/{criterion → criteria}/marshalable.rb +3 -1
- data/lib/mongoid/{criterion → criteria}/modifiable.rb +28 -8
- data/lib/mongoid/criteria/permission.rb +70 -0
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +39 -24
- data/lib/mongoid/errors.rb +4 -1
- data/lib/mongoid/errors/document_not_destroyed.rb +25 -0
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_storage_options.rb +1 -1
- data/lib/mongoid/errors/invalid_storage_parent.rb +26 -0
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/errors/readonly_document.rb +24 -0
- data/lib/mongoid/extensions.rb +15 -7
- data/lib/mongoid/extensions/array.rb +3 -3
- data/lib/mongoid/extensions/big_decimal.rb +1 -1
- data/lib/mongoid/extensions/boolean.rb +15 -17
- data/lib/mongoid/extensions/date.rb +1 -1
- data/lib/mongoid/extensions/date_time.rb +3 -3
- data/lib/mongoid/extensions/float.rb +2 -1
- data/lib/mongoid/extensions/hash.rb +3 -3
- data/lib/mongoid/extensions/integer.rb +1 -1
- data/lib/mongoid/extensions/object.rb +7 -7
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +9 -3
- data/lib/mongoid/extensions/regexp.rb +1 -1
- data/lib/mongoid/extensions/set.rb +1 -1
- data/lib/mongoid/extensions/string.rb +6 -18
- data/lib/mongoid/extensions/symbol.rb +1 -1
- data/lib/mongoid/extensions/time.rb +3 -3
- data/lib/mongoid/extensions/time_with_zone.rb +1 -1
- data/lib/mongoid/factory.rb +8 -6
- data/lib/mongoid/fields.rb +41 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/localized.rb +1 -1
- data/lib/mongoid/fields/standard.rb +5 -17
- data/lib/mongoid/fields/validators/macro.rb +15 -5
- data/lib/mongoid/{finders.rb → findable.rb} +35 -7
- data/lib/mongoid/{indexes.rb → indexable.rb} +50 -55
- data/lib/mongoid/indexable/specification.rb +104 -0
- data/lib/mongoid/{indexes → indexable}/validators/options.rb +2 -1
- data/lib/mongoid/{inspection.rb → inspectable.rb} +15 -11
- data/lib/mongoid/{callbacks.rb → interceptable.rb} +30 -62
- data/lib/mongoid/log_subscriber.rb +55 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/{matchers → matchable}/all.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/and.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/default.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/exists.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/gte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/in.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/lt.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/lte.rb +1 -1
- data/lib/mongoid/{matchers → matchable}/ne.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/persistable.rb +216 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -0
- data/lib/mongoid/persistable/destroyable.rb +60 -0
- data/lib/mongoid/persistable/incrementable.rb +36 -0
- data/lib/mongoid/persistable/logical.rb +38 -0
- data/lib/mongoid/persistable/poppable.rb +39 -0
- data/lib/mongoid/persistable/pullable.rb +55 -0
- data/lib/mongoid/persistable/pushable.rb +62 -0
- data/lib/mongoid/persistable/renamable.rb +35 -0
- data/lib/mongoid/persistable/savable.rb +52 -0
- data/lib/mongoid/persistable/settable.rb +33 -0
- data/lib/mongoid/persistable/unsettable.rb +36 -0
- data/lib/mongoid/persistable/updatable.rb +153 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/query_cache.rb +255 -0
- data/lib/mongoid/railtie.rb +34 -60
- data/lib/mongoid/railties/database.rake +9 -25
- data/lib/mongoid/relations.rb +11 -25
- data/lib/mongoid/relations/accessors.rb +15 -51
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +2 -25
- data/lib/mongoid/relations/bindings/embedded/in.rb +1 -1
- data/lib/mongoid/relations/bindings/embedded/many.rb +1 -3
- data/lib/mongoid/relations/bindings/referenced/in.rb +3 -8
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +4 -2
- data/lib/mongoid/relations/builder.rb +1 -1
- data/lib/mongoid/relations/builders.rb +2 -2
- data/lib/mongoid/relations/builders/embedded/one.rb +1 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +10 -13
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -6
- data/lib/mongoid/relations/builders/referenced/in.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +1 -2
- data/lib/mongoid/relations/builders/referenced/one.rb +1 -1
- data/lib/mongoid/relations/cascading.rb +3 -5
- data/lib/mongoid/relations/constraint.rb +1 -1
- data/lib/mongoid/relations/conversions.rb +1 -1
- data/lib/mongoid/relations/counter_cache.rb +39 -15
- data/lib/mongoid/relations/eager.rb +46 -0
- data/lib/mongoid/relations/eager/base.rb +149 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +31 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +47 -0
- data/lib/mongoid/relations/eager/has_many.rb +38 -0
- data/lib/mongoid/relations/eager/has_one.rb +30 -0
- data/lib/mongoid/relations/embedded/batchable.rb +4 -5
- data/lib/mongoid/relations/embedded/in.rb +4 -4
- data/lib/mongoid/relations/embedded/many.rb +14 -32
- data/lib/mongoid/relations/embedded/one.rb +1 -1
- data/lib/mongoid/relations/macros.rb +3 -4
- data/lib/mongoid/relations/many.rb +51 -31
- data/lib/mongoid/relations/marshalable.rb +3 -3
- data/lib/mongoid/relations/metadata.rb +14 -79
- data/lib/mongoid/relations/nested_builder.rb +2 -2
- data/lib/mongoid/relations/one.rb +1 -1
- data/lib/mongoid/relations/options.rb +1 -0
- data/lib/mongoid/relations/polymorphic.rb +0 -1
- data/lib/mongoid/relations/proxy.rb +21 -41
- data/lib/mongoid/relations/referenced/in.rb +4 -20
- data/lib/mongoid/relations/referenced/many.rb +22 -35
- data/lib/mongoid/relations/referenced/many_to_many.rb +19 -42
- data/lib/mongoid/relations/referenced/one.rb +6 -25
- data/lib/mongoid/relations/synchronization.rb +4 -4
- data/lib/mongoid/relations/targets/enumerable.rb +10 -10
- data/lib/mongoid/relations/touchable.rb +34 -1
- data/lib/mongoid/{reloading.rb → reloadable.rb} +7 -5
- data/lib/mongoid/{scoping.rb → scopable.rb} +36 -36
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +11 -2
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +185 -0
- data/lib/mongoid/sessions/storage_options.rb +140 -0
- data/lib/mongoid/sessions/thread_options.rb +19 -0
- data/lib/mongoid/sessions/validators/storage.rb +16 -3
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/{state.rb → stateful.rb} +13 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/tasks/database.rake +31 -0
- data/lib/mongoid/tasks/database.rb +107 -0
- data/lib/mongoid/threaded.rb +26 -172
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +15 -7
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -10
- data/lib/mongoid/{validations → validatable}/associated.rb +4 -2
- data/lib/mongoid/{validations → validatable}/format.rb +1 -1
- data/lib/mongoid/{validations → validatable}/length.rb +1 -1
- data/lib/mongoid/{validations → validatable}/localizable.rb +1 -1
- data/lib/mongoid/{validations → validatable}/macros.rb +4 -3
- data/lib/mongoid/{validations → validatable}/presence.rb +1 -1
- data/lib/mongoid/{validations → validatable}/queryable.rb +1 -2
- data/lib/mongoid/{validations → validatable}/uniqueness.rb +25 -21
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +46 -25
- data/lib/rails/generators/mongoid/model/model_generator.rb +0 -1
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +0 -3
- data/lib/rails/generators/mongoid_generator.rb +3 -40
- data/lib/rails/mongoid.rb +0 -122
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +2 -1
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +8 -3
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +3 -3
- data/spec/app/models/article.rb +1 -4
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/author.rb +0 -2
- data/spec/app/models/band.rb +3 -2
- data/spec/app/models/bar.rb +1 -0
- data/spec/app/models/book.rb +1 -0
- data/spec/app/models/building.rb +0 -2
- data/spec/app/models/building_address.rb +0 -2
- data/spec/app/models/bus.rb +1 -1
- data/spec/app/models/canvas.rb +1 -1
- data/spec/app/models/contextable_item.rb +5 -0
- data/spec/app/models/contractor.rb +0 -2
- data/spec/app/models/country_code.rb +1 -1
- data/spec/app/models/definition.rb +2 -2
- data/spec/app/models/dog.rb +1 -1
- data/spec/app/models/draft.rb +9 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/edit.rb +5 -0
- data/spec/app/models/even.rb +7 -0
- data/spec/app/models/event.rb +1 -1
- data/spec/app/models/filesystem.rb +1 -0
- data/spec/app/models/fish.rb +0 -1
- data/spec/app/models/fruits.rb +6 -0
- data/spec/app/models/game.rb +0 -2
- data/spec/app/models/house.rb +1 -3
- data/spec/app/models/id_key.rb +6 -0
- data/spec/app/models/item.rb +1 -5
- data/spec/app/models/jar.rb +1 -1
- data/spec/app/models/label.rb +4 -4
- data/spec/app/models/line_item.rb +1 -1
- data/spec/app/models/login.rb +1 -1
- data/spec/app/models/message.rb +8 -0
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +3 -1
- data/spec/app/models/odd.rb +7 -0
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +16 -10
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +3 -3
- data/spec/app/models/post.rb +5 -3
- data/spec/app/models/preference.rb +1 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +10 -5
- data/spec/app/models/registry.rb +1 -1
- data/spec/app/models/server.rb +1 -1
- data/spec/app/models/service.rb +3 -3
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/symptom.rb +1 -1
- data/spec/app/models/template.rb +1 -1
- data/spec/app/models/title.rb +0 -1
- data/spec/app/models/track.rb +5 -5
- data/spec/app/models/tree.rb +3 -3
- data/spec/app/models/video.rb +1 -5
- data/spec/app/models/wiki_page.rb +2 -5
- data/spec/app/models/word.rb +3 -0
- data/spec/app/models/word_origin.rb +1 -1
- data/spec/config/mongoid.yml +7 -8
- data/spec/helpers.rb +18 -0
- data/spec/mongoid/#atomic_spec.rb# +365 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +22 -22
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +8 -49
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +7 -49
- data/spec/mongoid/atomic/paths/root_spec.rb +3 -61
- data/spec/mongoid/atomic/paths_spec.rb +19 -19
- data/spec/mongoid/atomic_spec.rb +19 -19
- data/spec/mongoid/{nested_attributes_spec.rb → attributes/nested_spec.rb} +474 -592
- data/spec/mongoid/attributes/readonly_spec.rb +58 -18
- data/spec/mongoid/attributes_spec.rb +349 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +203 -153
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +78 -38
- data/spec/mongoid/contextual/atomic_spec.rb +60 -56
- data/spec/mongoid/contextual/find_and_modify_spec.rb +14 -14
- data/spec/mongoid/contextual/geo_near_spec.rb +22 -22
- data/spec/mongoid/contextual/map_reduce_spec.rb +27 -27
- data/spec/mongoid/contextual/memory_spec.rb +156 -94
- data/spec/mongoid/contextual/mongo_spec.rb +238 -150
- data/spec/mongoid/contextual/none_spec.rb +127 -0
- data/spec/mongoid/contextual/text_search_spec.rb +209 -0
- data/spec/mongoid/copyable_spec.rb +56 -68
- data/spec/mongoid/criteria/findable_spec.rb +991 -0
- data/spec/mongoid/{criterion/inspection_spec.rb → criteria/inspectable_spec.rb} +5 -5
- data/spec/mongoid/{criterion → criteria}/marshalable_spec.rb +2 -2
- data/spec/mongoid/criteria/modifiable_spec.rb +1252 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +37 -37
- data/spec/mongoid/criteria_spec.rb +715 -2421
- data/spec/mongoid/document_spec.rb +171 -121
- data/spec/mongoid/equality_spec.rb +22 -22
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +3 -3
- data/spec/mongoid/errors/callback_spec.rb +3 -3
- data/spec/mongoid/errors/delete_restriction_spec.rb +3 -3
- data/spec/mongoid/errors/document_not_destroyed_spec.rb +33 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +11 -11
- data/spec/mongoid/errors/eager_load_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_collection_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_config_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_option_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_field_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_find_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_includes_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_index_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_path_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_scope_spec.rb +5 -5
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +3 -3
- data/spec/mongoid/errors/invalid_time_spec.rb +3 -3
- data/spec/mongoid/errors/inverse_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_relations_spec.rb +3 -3
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +3 -3
- data/spec/mongoid/errors/mongoid_error_spec.rb +8 -8
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +3 -3
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +3 -3
- data/spec/mongoid/errors/no_metadata_spec.rb +3 -3
- data/spec/mongoid/errors/no_parent_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_config_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_database_spec.rb +3 -3
- data/spec/mongoid/errors/no_session_hosts_spec.rb +3 -3
- data/spec/mongoid/errors/no_sessions_config_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_attribute_spec.rb +3 -3
- data/spec/mongoid/errors/readonly_document_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +3 -3
- data/spec/mongoid/errors/unknown_attribute_spec.rb +5 -5
- data/spec/mongoid/errors/unsaved_document_spec.rb +3 -3
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +3 -3
- data/spec/mongoid/errors/validations_spec.rb +7 -7
- data/spec/mongoid/extensions/array_spec.rb +61 -61
- data/spec/mongoid/extensions/big_decimal_spec.rb +11 -11
- data/spec/mongoid/extensions/binary_spec.rb +12 -12
- data/spec/mongoid/extensions/boolean_spec.rb +18 -18
- data/spec/mongoid/extensions/date_spec.rb +13 -13
- data/spec/mongoid/extensions/date_time_spec.rb +8 -8
- data/spec/mongoid/extensions/false_class_spec.rb +5 -5
- data/spec/mongoid/extensions/float_spec.rb +29 -15
- data/spec/mongoid/extensions/hash_spec.rb +29 -29
- data/spec/mongoid/extensions/integer_spec.rb +15 -15
- data/spec/mongoid/extensions/module_spec.rb +2 -2
- data/spec/mongoid/extensions/nil_class_spec.rb +1 -1
- data/spec/mongoid/extensions/object_id_spec.rb +134 -134
- data/spec/mongoid/extensions/object_spec.rb +26 -26
- data/spec/mongoid/extensions/range_spec.rb +61 -12
- data/spec/mongoid/extensions/regexp_spec.rb +4 -4
- data/spec/mongoid/extensions/set_spec.rb +4 -4
- data/spec/mongoid/extensions/string_spec.rb +35 -46
- data/spec/mongoid/extensions/symbol_spec.rb +9 -9
- data/spec/mongoid/extensions/time_spec.rb +49 -49
- data/spec/mongoid/extensions/time_with_zone_spec.rb +34 -34
- data/spec/mongoid/extensions/true_class_spec.rb +5 -5
- data/spec/mongoid/extensions_spec.rb +29 -0
- data/spec/mongoid/factory_spec.rb +15 -15
- data/spec/mongoid/fields/foreign_key_spec.rb +73 -66
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +15 -15
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +22 -22
- data/spec/mongoid/fields/localized_spec.rb +38 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +263 -217
- data/spec/mongoid/findable_spec.rb +509 -0
- data/spec/mongoid/indexable/specification_spec.rb +102 -0
- data/spec/mongoid/{indexes_spec.rb → indexable_spec.rb} +171 -51
- data/spec/mongoid/{inspection_spec.rb → inspectable_spec.rb} +6 -14
- data/spec/mongoid/{callbacks_spec.rb → interceptable_spec.rb} +117 -116
- data/spec/mongoid/log_subscriber_spec.rb +75 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/matchable/ne_spec.rb +46 -0
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +553 -0
- data/spec/mongoid/persistable/deletable_spec.rb +218 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +192 -0
- data/spec/mongoid/persistable/incrementable_spec.rb +173 -0
- data/spec/mongoid/persistable/logical_spec.rb +143 -0
- data/spec/mongoid/persistable/poppable_spec.rb +115 -0
- data/spec/mongoid/persistable/pullable_spec.rb +228 -0
- data/spec/mongoid/persistable/pushable_spec.rb +258 -0
- data/spec/mongoid/persistable/renamable_spec.rb +135 -0
- data/spec/mongoid/persistable/savable_spec.rb +498 -0
- data/spec/mongoid/persistable/settable_spec.rb +162 -0
- data/spec/mongoid/persistable/unsettable_spec.rb +155 -0
- data/spec/mongoid/persistable/updatable_spec.rb +558 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/{atomic/positionable_spec.rb → positional_spec.rb} +14 -19
- data/spec/mongoid/query_cache_spec.rb +263 -0
- data/spec/mongoid/railties/document_spec.rb +2 -2
- data/spec/mongoid/relations/accessors_spec.rb +53 -145
- data/spec/mongoid/relations/auto_save_spec.rb +37 -17
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +5 -5
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +26 -26
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +10 -10
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +19 -19
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +12 -12
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +4 -4
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +11 -11
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +12 -13
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +14 -14
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +24 -35
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +15 -15
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +18 -18
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +12 -25
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +9 -9
- data/spec/mongoid/relations/cascading/destroy_spec.rb +6 -6
- data/spec/mongoid/relations/cascading/nullify_spec.rb +4 -4
- data/spec/mongoid/relations/cascading/restrict_spec.rb +7 -7
- data/spec/mongoid/relations/cascading_spec.rb +16 -16
- data/spec/mongoid/relations/constraint_spec.rb +8 -7
- data/spec/mongoid/relations/conversions_spec.rb +16 -14
- data/spec/mongoid/relations/counter_cache_spec.rb +85 -0
- data/spec/mongoid/relations/cyclic_spec.rb +18 -18
- data/spec/mongoid/relations/eager/belongs_to_spec.rb +154 -0
- data/spec/mongoid/relations/eager/has_and_belongs_to_many_spec.rb +117 -0
- data/spec/mongoid/relations/eager/has_many_spec.rb +207 -0
- data/spec/mongoid/relations/eager/has_one_spec.rb +163 -0
- data/spec/mongoid/relations/eager_spec.rb +228 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +8 -8
- data/spec/mongoid/relations/embedded/in_spec.rb +56 -57
- data/spec/mongoid/relations/embedded/many_spec.rb +467 -372
- data/spec/mongoid/relations/embedded/one_spec.rb +108 -141
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +180 -255
- data/spec/mongoid/relations/options_spec.rb +1 -1
- data/spec/mongoid/relations/polymorphic_spec.rb +13 -17
- data/spec/mongoid/relations/proxy_spec.rb +2 -2
- data/spec/mongoid/relations/referenced/in_spec.rb +128 -303
- data/spec/mongoid/relations/referenced/many_spec.rb +587 -527
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +401 -424
- data/spec/mongoid/relations/referenced/one_spec.rb +149 -264
- data/spec/mongoid/relations/reflections_spec.rb +6 -6
- data/spec/mongoid/relations/synchronization_spec.rb +46 -50
- data/spec/mongoid/relations/targets/enumerable_spec.rb +118 -118
- data/spec/mongoid/relations/touchable_spec.rb +333 -0
- data/spec/mongoid/relations_spec.rb +16 -15
- data/spec/mongoid/{reloading_spec.rb → reloadable_spec.rb} +38 -55
- data/spec/mongoid/{scoping_spec.rb → scopable_spec.rb} +89 -164
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +129 -82
- data/spec/mongoid/sessions/factory_spec.rb +49 -28
- data/spec/mongoid/sessions/mongo_uri_spec.rb +7 -7
- data/spec/mongoid/sessions/options_spec.rb +108 -0
- data/spec/mongoid/sessions_spec.rb +319 -178
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/{state_spec.rb → stateful_spec.rb} +36 -11
- data/spec/mongoid/tasks/database_rake_spec.rb +285 -0
- data/spec/mongoid/tasks/database_spec.rb +160 -0
- data/spec/mongoid/threaded_spec.rb +17 -70
- data/spec/mongoid/timestamps/created/short_spec.rb +6 -6
- data/spec/mongoid/timestamps/created_spec.rb +5 -5
- data/spec/mongoid/timestamps/timeless_spec.rb +6 -6
- data/spec/mongoid/timestamps/updated/short_spec.rb +11 -11
- data/spec/mongoid/timestamps/updated_spec.rb +9 -13
- data/spec/mongoid/timestamps_spec.rb +9 -13
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +45 -22
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +14 -14
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +37 -44
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +184 -192
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +19 -335
- data/spec/spec_helper.rb +31 -13
- metadata +303 -283
- data/lib/mongoid/atomic/positionable.rb +0 -73
- data/lib/mongoid/components.rb +0 -92
- data/lib/mongoid/config/inflections.rb +0 -6
- data/lib/mongoid/contextual/eager.rb +0 -158
- data/lib/mongoid/errors/versioning_not_on_root.rb +0 -23
- data/lib/mongoid/identity_map.rb +0 -163
- data/lib/mongoid/json.rb +0 -16
- data/lib/mongoid/matchers.rb +0 -32
- data/lib/mongoid/matchers/strategies.rb +0 -97
- data/lib/mongoid/multi_parameter_attributes.rb +0 -105
- data/lib/mongoid/nested_attributes.rb +0 -78
- data/lib/mongoid/observer.rb +0 -192
- data/lib/mongoid/paranoia.rb +0 -136
- data/lib/mongoid/persistence.rb +0 -357
- data/lib/mongoid/persistence/atomic.rb +0 -231
- data/lib/mongoid/persistence/atomic/add_to_set.rb +0 -47
- data/lib/mongoid/persistence/atomic/bit.rb +0 -35
- data/lib/mongoid/persistence/atomic/inc.rb +0 -45
- data/lib/mongoid/persistence/atomic/operation.rb +0 -154
- data/lib/mongoid/persistence/atomic/pop.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull.rb +0 -32
- data/lib/mongoid/persistence/atomic/pull_all.rb +0 -32
- data/lib/mongoid/persistence/atomic/push.rb +0 -25
- data/lib/mongoid/persistence/atomic/push_all.rb +0 -25
- data/lib/mongoid/persistence/atomic/rename.rb +0 -30
- data/lib/mongoid/persistence/atomic/sets.rb +0 -28
- data/lib/mongoid/persistence/atomic/unset.rb +0 -27
- data/lib/mongoid/persistence/deletion.rb +0 -31
- data/lib/mongoid/persistence/insertion.rb +0 -38
- data/lib/mongoid/persistence/modification.rb +0 -35
- data/lib/mongoid/persistence/operations.rb +0 -214
- data/lib/mongoid/persistence/operations/embedded/insert.rb +0 -46
- data/lib/mongoid/persistence/operations/embedded/remove.rb +0 -43
- data/lib/mongoid/persistence/operations/insert.rb +0 -34
- data/lib/mongoid/persistence/operations/remove.rb +0 -33
- data/lib/mongoid/persistence/operations/update.rb +0 -59
- data/lib/mongoid/persistence/operations/upsert.rb +0 -28
- data/lib/mongoid/persistence/upsertion.rb +0 -31
- data/lib/mongoid/unit_of_work.rb +0 -61
- data/lib/mongoid/versioning.rb +0 -217
- data/lib/rack/mongoid.rb +0 -2
- data/lib/rack/mongoid/middleware/identity_map.rb +0 -39
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +0 -17
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +0 -4
- data/spec/app/models/actor_observer.rb +0 -15
- data/spec/app/models/callback_recorder.rb +0 -25
- data/spec/app/models/paranoid_phone.rb +0 -25
- data/spec/app/models/paranoid_post.rb +0 -36
- data/spec/app/models/phone_observer.rb +0 -6
- data/spec/mongoid/attributes/processing_spec.rb +0 -149
- data/spec/mongoid/criterion/destructive_spec.rb +0 -101
- data/spec/mongoid/criterion/modifiable_spec.rb +0 -409
- data/spec/mongoid/criterion/modification_spec.rb +0 -402
- data/spec/mongoid/errors/versioning_not_on_root_spec.rb +0 -29
- data/spec/mongoid/finders_spec.rb +0 -321
- data/spec/mongoid/identity_map_spec.rb +0 -564
- data/spec/mongoid/json_spec.rb +0 -33
- data/spec/mongoid/matchers/in_spec.rb +0 -25
- data/spec/mongoid/matchers/ne_spec.rb +0 -25
- data/spec/mongoid/matchers/nin_spec.rb +0 -25
- data/spec/mongoid/multi_parameter_attributes_spec.rb +0 -128
- data/spec/mongoid/observer_spec.rb +0 -290
- data/spec/mongoid/paranoia_spec.rb +0 -759
- data/spec/mongoid/persistence/atomic/add_to_set_spec.rb +0 -262
- data/spec/mongoid/persistence/atomic/bit_spec.rb +0 -88
- data/spec/mongoid/persistence/atomic/inc_spec.rb +0 -133
- data/spec/mongoid/persistence/atomic/pop_spec.rb +0 -111
- data/spec/mongoid/persistence/atomic/pull_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/pull_spec.rb +0 -80
- data/spec/mongoid/persistence/atomic/push_all_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/push_spec.rb +0 -77
- data/spec/mongoid/persistence/atomic/rename_spec.rb +0 -42
- data/spec/mongoid/persistence/atomic/sets_spec.rb +0 -154
- data/spec/mongoid/persistence/atomic/unset_spec.rb +0 -65
- data/spec/mongoid/persistence/atomic_spec.rb +0 -216
- data/spec/mongoid/persistence/operations/embedded/insert_spec.rb +0 -191
- data/spec/mongoid/persistence/operations/embedded/remove_spec.rb +0 -8
- data/spec/mongoid/persistence/operations/insert_spec.rb +0 -149
- data/spec/mongoid/persistence/operations/remove_spec.rb +0 -113
- data/spec/mongoid/persistence/operations/update_spec.rb +0 -141
- data/spec/mongoid/persistence/operations/upsert_spec.rb +0 -59
- data/spec/mongoid/persistence/operations_spec.rb +0 -313
- data/spec/mongoid/persistence_spec.rb +0 -2279
- data/spec/mongoid/unit_of_work_spec.rb +0 -196
- data/spec/mongoid/versioning_spec.rb +0 -540
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +0 -72
@@ -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
|
@@ -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
|
|
@@ -1,9 +1,12 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
|
2
3
|
module Mongoid
|
3
4
|
|
4
5
|
# This module contains behaviour for all Mongoid scoping - named scopes,
|
5
6
|
# default scopes, and criteria accessors via scoped and unscoped.
|
6
|
-
|
7
|
+
#
|
8
|
+
# @since 4.0.0
|
9
|
+
module Scopable
|
7
10
|
extend ActiveSupport::Concern
|
8
11
|
|
9
12
|
included do
|
@@ -12,6 +15,27 @@ module Mongoid
|
|
12
15
|
self._declared_scopes = {}
|
13
16
|
end
|
14
17
|
|
18
|
+
private
|
19
|
+
|
20
|
+
# Apply the default scoping to the attributes of the document, as long as
|
21
|
+
# they are not complex queries.
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
#
|
25
|
+
# @example Apply the default scoping.
|
26
|
+
# document.apply_default_scoping
|
27
|
+
#
|
28
|
+
# @return [ true, false ] If default scoping was applied.
|
29
|
+
#
|
30
|
+
# @since 4.0.0
|
31
|
+
def apply_default_scoping
|
32
|
+
if default_scoping
|
33
|
+
default_scoping.call.selector.each do |field, value|
|
34
|
+
attributes[field] = value unless value.respond_to?(:each_pair)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
15
39
|
module ClassMethods
|
16
40
|
|
17
41
|
# Returns a hash of all the scopes defined for this class, including
|
@@ -22,7 +46,7 @@ module Mongoid
|
|
22
46
|
# include Mongoid::Document
|
23
47
|
# field :active, type: Boolean
|
24
48
|
#
|
25
|
-
# scope :active, where(active: true)
|
49
|
+
# scope :active, -> { where(active: true) }
|
26
50
|
# end
|
27
51
|
# Band.scopes
|
28
52
|
#
|
@@ -104,14 +128,14 @@ module Mongoid
|
|
104
128
|
# field :active, type: Boolean
|
105
129
|
# field :count, type: Integer
|
106
130
|
#
|
107
|
-
# scope :active, where(active: true)
|
131
|
+
# scope :active, -> { where(active: true) }
|
108
132
|
# scope :at_least, ->(count){ where(:count.gt => count) }
|
109
133
|
# end
|
110
134
|
#
|
111
135
|
# @param [ Symbol ] name The name of the scope.
|
112
|
-
# @param [ Proc
|
136
|
+
# @param [ Proc ] conditions The conditions of the scope.
|
113
137
|
#
|
114
|
-
# @raise [ Errors::InvalidScope ] If the scope is not a proc
|
138
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a proc.
|
115
139
|
# @raise [ Errors::ScopeOverwrite ] If the scope name already exists.
|
116
140
|
#
|
117
141
|
# @since 1.0.0
|
@@ -120,7 +144,7 @@ module Mongoid
|
|
120
144
|
check_scope_validity(value)
|
121
145
|
check_scope_name(normalized)
|
122
146
|
_declared_scopes[normalized] = {
|
123
|
-
scope:
|
147
|
+
scope: value,
|
124
148
|
extension: Module.new(&block)
|
125
149
|
}
|
126
150
|
define_scope_method(normalized)
|
@@ -279,7 +303,7 @@ module Mongoid
|
|
279
303
|
#
|
280
304
|
# @since 3.0.0
|
281
305
|
def check_scope_validity(value)
|
282
|
-
unless value.respond_to?(:
|
306
|
+
unless value.respond_to?(:call)
|
283
307
|
raise Errors::InvalidScope.new(self, value)
|
284
308
|
end
|
285
309
|
end
|
@@ -298,15 +322,15 @@ module Mongoid
|
|
298
322
|
#
|
299
323
|
# @since 3.0.0
|
300
324
|
def define_scope_method(name)
|
301
|
-
|
302
|
-
|
303
|
-
scoping = _declared_scopes[
|
325
|
+
singleton_class.class_eval do
|
326
|
+
define_method name do |*args|
|
327
|
+
scoping = _declared_scopes[name]
|
304
328
|
scope, extension = scoping[:scope][*args], scoping[:extension]
|
305
|
-
criteria = with_default_scope.merge(scope ||
|
329
|
+
criteria = with_default_scope.merge(scope || queryable)
|
306
330
|
criteria.extend(extension)
|
307
331
|
criteria
|
308
332
|
end
|
309
|
-
|
333
|
+
end
|
310
334
|
end
|
311
335
|
|
312
336
|
# Process the default scope value. If one already exists, we merge the
|
@@ -327,30 +351,6 @@ module Mongoid
|
|
327
351
|
value.to_proc
|
328
352
|
end
|
329
353
|
end
|
330
|
-
|
331
|
-
# Strip the default scope from the provided value, if it is a criteria.
|
332
|
-
# This is used by named scopes - they should not have the default scoping
|
333
|
-
# applied to them.
|
334
|
-
#
|
335
|
-
# @api private
|
336
|
-
#
|
337
|
-
# @example Strip the default scope.
|
338
|
-
# Model.strip_default_scope
|
339
|
-
#
|
340
|
-
# @param [ Proc, Criteria ] value The value to strip from.
|
341
|
-
#
|
342
|
-
# @return [ Proc ] The stripped criteria, as a proc.
|
343
|
-
#
|
344
|
-
# @since 3.0.0
|
345
|
-
def strip_default_scope(value)
|
346
|
-
if value.is_a?(Criteria)
|
347
|
-
default = default_scoping.try(:call)
|
348
|
-
value.remove_scoping(default)
|
349
|
-
value.to_proc
|
350
|
-
else
|
351
|
-
value
|
352
|
-
end
|
353
|
-
end
|
354
354
|
end
|
355
355
|
end
|
356
356
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# Provides behaviour for generating the selector for a specific document.
|
5
|
+
#
|
6
|
+
# @since 4.0.0
|
7
|
+
module Selectable
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
# Get the atomic selector for the document. This is a hash in the simplest
|
11
|
+
# case { "_id" => id }, but can become more complex for embedded documents
|
12
|
+
# and documents that use a shard key.
|
13
|
+
#
|
14
|
+
# @example Get the document's atomic selector.
|
15
|
+
# document.atomic_selector
|
16
|
+
#
|
17
|
+
# @return [ Hash ] The document's selector.
|
18
|
+
#
|
19
|
+
# @since 1.0.0
|
20
|
+
def atomic_selector
|
21
|
+
@atomic_selector ||=
|
22
|
+
(embedded? ? embedded_atomic_selector : root_atomic_selector)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# Get the atomic selector for an embedded document.
|
28
|
+
#
|
29
|
+
# @api private
|
30
|
+
#
|
31
|
+
# @example Get the embedded atomic selector.
|
32
|
+
# document.embedded_atomic_selector
|
33
|
+
#
|
34
|
+
# @return [ Hash ] The embedded document selector.
|
35
|
+
#
|
36
|
+
# @since 4.0.0
|
37
|
+
def embedded_atomic_selector
|
38
|
+
if persisted? && _id_changed?
|
39
|
+
_parent.atomic_selector
|
40
|
+
else
|
41
|
+
_parent.atomic_selector.merge("#{atomic_path}._id" => _id)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Get the atomic selector for a root document.
|
46
|
+
#
|
47
|
+
# @api private
|
48
|
+
#
|
49
|
+
# @example Get the root atomic selector.
|
50
|
+
# document.root_atomic_selector
|
51
|
+
#
|
52
|
+
# @return [ Hash ] The root document selector.
|
53
|
+
#
|
54
|
+
# @since 4.0.0
|
55
|
+
def root_atomic_selector
|
56
|
+
{ "_id" => _id }.merge!(shard_key_selector)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -3,9 +3,18 @@ module Mongoid
|
|
3
3
|
|
4
4
|
# This module provides the extra behaviour for including relations in JSON
|
5
5
|
# and XML serialization.
|
6
|
-
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Serializable
|
7
9
|
extend ActiveSupport::Concern
|
8
10
|
|
11
|
+
# We need to redefine where the JSON configuration is getting defined,
|
12
|
+
# similar to +ActiveRecord+.
|
13
|
+
included do
|
14
|
+
undef_method :include_root_in_json
|
15
|
+
delegate :include_root_in_json, to: ::Mongoid
|
16
|
+
end
|
17
|
+
|
9
18
|
# Gets the document as a serializable hash, used by ActiveModel's JSON
|
10
19
|
# serializer.
|
11
20
|
#
|
@@ -93,7 +102,7 @@ module Mongoid
|
|
93
102
|
attrs[name] = value ? value.serializable_hash(options) : nil
|
94
103
|
elsif names.include?(name) && !fields.has_key?(name)
|
95
104
|
attrs[name] = read_attribute(name)
|
96
|
-
|
105
|
+
elsif !attribute_missing?(name)
|
97
106
|
attrs[name] = send(name)
|
98
107
|
end
|
99
108
|
end
|
data/lib/mongoid/sessions.rb
CHANGED
@@ -1,90 +1,18 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "mongoid/sessions/factory"
|
3
3
|
require "mongoid/sessions/validators"
|
4
|
+
require "mongoid/sessions/storage_options"
|
5
|
+
require "mongoid/sessions/thread_options"
|
6
|
+
require "mongoid/sessions/options"
|
4
7
|
|
5
8
|
module Mongoid
|
6
9
|
module Sessions
|
7
10
|
extend ActiveSupport::Concern
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
self.default_collection_name = self.name.collectionize.to_sym
|
12
|
-
end
|
13
|
-
|
14
|
-
# Get the collection for this model from the session. Will check for an
|
15
|
-
# overridden collection name from the store_in macro or the collection
|
16
|
-
# with a pluralized model name.
|
17
|
-
#
|
18
|
-
# @example Get the model's collection.
|
19
|
-
# Model.collection
|
20
|
-
#
|
21
|
-
# @return [ Moped::Collection ] The collection.
|
22
|
-
#
|
23
|
-
# @since 3.0.0
|
24
|
-
def collection
|
25
|
-
self.class.collection
|
26
|
-
end
|
27
|
-
|
28
|
-
# Get the name of the collection this model persists to. This will be
|
29
|
-
# either the pluralized class name or the option defined in the store_in
|
30
|
-
# macro.
|
31
|
-
#
|
32
|
-
# @example Get the collection name.
|
33
|
-
# Model.collection_name
|
34
|
-
#
|
35
|
-
# @return [ String ] The name of the collection.
|
36
|
-
#
|
37
|
-
# @since 3.0.0
|
38
|
-
def collection_name
|
39
|
-
self.class.collection_name
|
40
|
-
end
|
41
|
-
|
42
|
-
# Get the session for this model. This is determined in the following order:
|
43
|
-
#
|
44
|
-
# 1. Any custom configuration provided by the 'store_in' macro.
|
45
|
-
# 2. The 'default' session as provided in the mongoid.yml
|
46
|
-
#
|
47
|
-
# @example Get the session.
|
48
|
-
# model.mongo_session
|
49
|
-
#
|
50
|
-
# @return [ Moped::Session ] The default moped session.
|
51
|
-
#
|
52
|
-
# @since 3.0.0
|
53
|
-
def mongo_session
|
54
|
-
self.class.mongo_session
|
55
|
-
end
|
56
|
-
|
57
|
-
# Tell the next persistance operation to store in a specific collection,
|
58
|
-
# database or session.
|
59
|
-
#
|
60
|
-
# @example Save the current document to a different collection.
|
61
|
-
# model.with(collection: "secondary").save
|
62
|
-
#
|
63
|
-
# @example Save the current document to a different database.
|
64
|
-
# model.with(database: "secondary").save
|
65
|
-
#
|
66
|
-
# @example Save the current document to a different session.
|
67
|
-
# model.with(session: "replica_set").save
|
68
|
-
#
|
69
|
-
# @example Save with a combination of options.
|
70
|
-
# model.with(session: "sharded", database: "secondary").save
|
71
|
-
#
|
72
|
-
# @param [ Hash ] options The storage options.
|
73
|
-
#
|
74
|
-
# @option options [ String, Symbol ] :collection The collection name.
|
75
|
-
# @option options [ String, Symbol ] :database The database name.
|
76
|
-
# @option options [ String, Symbol ] :session The session name.
|
77
|
-
#
|
78
|
-
# @return [ Document ] The current document.
|
79
|
-
#
|
80
|
-
# @since 3.0.0
|
81
|
-
def with(options)
|
82
|
-
Threaded.set_persistence_options(self.class, options)
|
83
|
-
self
|
84
|
-
end
|
11
|
+
include StorageOptions
|
12
|
+
include ThreadOptions
|
13
|
+
include Options
|
85
14
|
|
86
15
|
class << self
|
87
|
-
|
88
16
|
# Clear all sessions from the current thread.
|
89
17
|
#
|
90
18
|
# @example Clear all sessions.
|
@@ -138,79 +66,29 @@ module Mongoid
|
|
138
66
|
end
|
139
67
|
end
|
140
68
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
# Get the collection for this model from the session. Will check for an
|
156
|
-
# overridden collection name from the store_in macro or the collection
|
157
|
-
# with a pluralized model name.
|
158
|
-
#
|
159
|
-
# @example Get the model's collection.
|
160
|
-
# Model.collection
|
161
|
-
#
|
162
|
-
# @return [ Moped::Collection ] The collection.
|
163
|
-
#
|
164
|
-
# @since 3.0.0
|
165
|
-
def collection
|
166
|
-
if opts = persistence_options
|
167
|
-
coll = mongo_session.with(opts)[opts[:collection] || collection_name]
|
168
|
-
clear_persistence_options unless validating_with_query? || _loading_revision?
|
169
|
-
coll
|
170
|
-
else
|
171
|
-
mongo_session[collection_name]
|
172
|
-
end
|
173
|
-
end
|
69
|
+
# Get the collection for this model from the session. Will check for an
|
70
|
+
# overridden collection name from the store_in macro or the collection
|
71
|
+
# with a pluralized model name.
|
72
|
+
#
|
73
|
+
# @example Get the model's collection.
|
74
|
+
# Model.collection
|
75
|
+
#
|
76
|
+
# @return [ Moped::Collection ] The collection.
|
77
|
+
#
|
78
|
+
# @since 3.0.0
|
79
|
+
def collection
|
80
|
+
mongo_session[collection_name]
|
81
|
+
end
|
174
82
|
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
#
|
179
|
-
# @example Get the collection name.
|
180
|
-
# Model.collection_name
|
181
|
-
#
|
182
|
-
# @return [ Symbol ] The name of the collection.
|
183
|
-
#
|
184
|
-
# @since 3.0.0
|
185
|
-
def collection_name
|
186
|
-
__collection_name__
|
187
|
-
end
|
83
|
+
def mongo_session
|
84
|
+
super || self.class.mongo_session
|
85
|
+
end
|
188
86
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
# Model.database_name
|
193
|
-
#
|
194
|
-
# @return [ Symbol ] The name of the database.
|
195
|
-
#
|
196
|
-
# @since 3.0.0
|
197
|
-
def database_name
|
198
|
-
__database_name__
|
199
|
-
end
|
87
|
+
def collection_name
|
88
|
+
super || self.class.collection_name
|
89
|
+
end
|
200
90
|
|
201
|
-
|
202
|
-
# using +Model.with+ or by overriding at the global level via
|
203
|
-
# +Mongoid.override_database(:name)+.
|
204
|
-
#
|
205
|
-
# @example Get the overridden database name.
|
206
|
-
# Model.database_override
|
207
|
-
#
|
208
|
-
# @return [ String, Symbol ] The overridden database name.
|
209
|
-
#
|
210
|
-
# @since 3.0.0
|
211
|
-
def database_override
|
212
|
-
persistence_options.try { |opts| opts[:database] } || Threaded.database_override
|
213
|
-
end
|
91
|
+
module ClassMethods
|
214
92
|
|
215
93
|
# Get the session for this model. This is determined in the following order:
|
216
94
|
#
|
@@ -224,209 +102,23 @@ module Mongoid
|
|
224
102
|
#
|
225
103
|
# @since 3.0.0
|
226
104
|
def mongo_session
|
227
|
-
session =
|
228
|
-
session.use(
|
229
|
-
session
|
105
|
+
session = Sessions.with_name(session_name)
|
106
|
+
session.use(database_name)
|
107
|
+
self.persistence_options ? session.with(self.persistence_options) : session
|
230
108
|
end
|
231
109
|
|
232
|
-
# Get the
|
233
|
-
#
|
234
|
-
#
|
235
|
-
# Model.persistence_options
|
236
|
-
#
|
237
|
-
# @return [ Hash ] The persistence options.
|
238
|
-
#
|
239
|
-
# @since 3.0.0
|
240
|
-
def persistence_options
|
241
|
-
Threaded.persistence_options(self)
|
242
|
-
end
|
243
|
-
|
244
|
-
# Get the overridden session name. This either can be overridden by
|
245
|
-
# using +Model.with+ or by overriding at the global level via
|
246
|
-
# +Mongoid.override_session(:name)+.
|
247
|
-
#
|
248
|
-
# @example Get the overridden session name.
|
249
|
-
# Model.session_override
|
250
|
-
#
|
251
|
-
# @return [ String, Symbol ] The overridden session name.
|
252
|
-
#
|
253
|
-
# @since 3.0.0
|
254
|
-
def session_override
|
255
|
-
persistence_options.try { |opts| opts[:session] } || Threaded.session_override
|
256
|
-
end
|
257
|
-
|
258
|
-
# Give this model specific custom default storage options.
|
259
|
-
#
|
260
|
-
# @example Store this model by default in "artists"
|
261
|
-
# class Band
|
262
|
-
# include Mongoid::Document
|
263
|
-
# store_in collection: "artists"
|
264
|
-
# end
|
265
|
-
#
|
266
|
-
# @example Store this model by default in the sharded db.
|
267
|
-
# class Band
|
268
|
-
# include Mongoid::Document
|
269
|
-
# store_in database: "echo_shard"
|
270
|
-
# end
|
271
|
-
#
|
272
|
-
# @example Store this model by default in a different session.
|
273
|
-
# class Band
|
274
|
-
# include Mongoid::Document
|
275
|
-
# store_in session: "secondary"
|
276
|
-
# end
|
277
|
-
#
|
278
|
-
# @example Store this model with a combination of options.
|
279
|
-
# class Band
|
280
|
-
# include Mongoid::Document
|
281
|
-
# store_in collection: "artists", database: "secondary"
|
282
|
-
# end
|
283
|
-
#
|
284
|
-
# @param [ Hash ] options The storage options.
|
285
|
-
#
|
286
|
-
# @option options [ String, Symbol ] :collection The collection name.
|
287
|
-
# @option options [ String, Symbol ] :database The database name.
|
288
|
-
# @option options [ String, Symbol ] :session The session name.
|
289
|
-
#
|
290
|
-
# @return [ Class ] The model class.
|
291
|
-
#
|
292
|
-
# @since 3.0.0
|
293
|
-
def store_in(options)
|
294
|
-
Validators::Storage.validate(self, options)
|
295
|
-
self.storage_options ||= {}
|
296
|
-
self.storage_options.merge!(options)
|
297
|
-
end
|
298
|
-
|
299
|
-
# Tell the next persistance operation to store in a specific collection,
|
300
|
-
# database or session.
|
301
|
-
#
|
302
|
-
# @example Create a document in a different collection.
|
303
|
-
# Model.with(collection: "secondary").create(name: "test")
|
304
|
-
#
|
305
|
-
# @example Create a document in a different database.
|
306
|
-
# Model.with(database: "secondary").create(name: "test")
|
307
|
-
#
|
308
|
-
# @example Create a document in a different session.
|
309
|
-
# Model.with(session: "secondary").create(name: "test")
|
310
|
-
#
|
311
|
-
# @example Create with a combination of options.
|
312
|
-
# Model.with(session: "sharded", database: "secondary").create
|
313
|
-
#
|
314
|
-
# @param [ Hash ] options The storage options.
|
315
|
-
#
|
316
|
-
# @option options [ String, Symbol ] :collection The collection name.
|
317
|
-
# @option options [ String, Symbol ] :database The database name.
|
318
|
-
# @option options [ String, Symbol ] :session The session name.
|
319
|
-
#
|
320
|
-
# @return [ Class ] The model class.
|
321
|
-
#
|
322
|
-
# @since 3.0.0
|
323
|
-
def with(options)
|
324
|
-
Threaded.set_persistence_options(self, options)
|
325
|
-
self
|
326
|
-
end
|
327
|
-
|
328
|
-
private
|
329
|
-
|
330
|
-
# Get the name of the collection this model persists to.
|
331
|
-
#
|
332
|
-
# @example Get the collection name.
|
333
|
-
# Model.__collection_name__
|
334
|
-
#
|
335
|
-
# @return [ Symbol ] The name of the collection.
|
336
|
-
#
|
337
|
-
# @since 3.0.0
|
338
|
-
def __collection_name__
|
339
|
-
if storage_options && name = storage_options[:collection]
|
340
|
-
__evaluate__(name)
|
341
|
-
else
|
342
|
-
default_collection_name
|
343
|
-
end
|
344
|
-
end
|
345
|
-
|
346
|
-
# Get the database name for the model.
|
347
|
-
#
|
348
|
-
# @example Get the database name.
|
349
|
-
# Model.__database_name__
|
350
|
-
#
|
351
|
-
# @return [ Symbol ] The name of the database.
|
352
|
-
#
|
353
|
-
# @since 3.0.0
|
354
|
-
def __database_name__
|
355
|
-
if storage_options && name = storage_options[:database]
|
356
|
-
__evaluate__(name)
|
357
|
-
else
|
358
|
-
Mongoid.sessions[__session_name__][:database]
|
359
|
-
end
|
360
|
-
end
|
361
|
-
|
362
|
-
# Get the session name for the model.
|
363
|
-
#
|
364
|
-
# @example Get the session name.
|
365
|
-
# Model.__session_name__
|
366
|
-
#
|
367
|
-
# @return [ Symbol ] The name of the session.
|
368
|
-
#
|
369
|
-
# @since 3.0.0
|
370
|
-
def __session_name__
|
371
|
-
if storage_options && name = storage_options[:session]
|
372
|
-
__evaluate__(name)
|
373
|
-
else
|
374
|
-
:default
|
375
|
-
end
|
376
|
-
end
|
377
|
-
|
378
|
-
# Get the session for this class.
|
110
|
+
# Get the collection for this model from the session. Will check for an
|
111
|
+
# overridden collection name from the store_in macro or the collection
|
112
|
+
# with a pluralized model name.
|
379
113
|
#
|
380
|
-
# @example Get the
|
381
|
-
# Model.
|
114
|
+
# @example Get the model's collection.
|
115
|
+
# Model.collection
|
382
116
|
#
|
383
|
-
# @return [ Moped::
|
117
|
+
# @return [ Moped::Collection ] The collection.
|
384
118
|
#
|
385
119
|
# @since 3.0.0
|
386
|
-
def
|
387
|
-
|
388
|
-
Sessions.with_name(name)
|
389
|
-
else
|
390
|
-
Sessions.with_name(__session_name__)
|
391
|
-
end
|
392
|
-
end
|
393
|
-
|
394
|
-
# Eval the provided value, either byt calling it if it responds to call
|
395
|
-
# or returning the value itself.
|
396
|
-
#
|
397
|
-
# @api private
|
398
|
-
#
|
399
|
-
# @example Evaluate the name.
|
400
|
-
# Model.__evaluate__(:name)
|
401
|
-
#
|
402
|
-
# @param [ String, Symbol, Proc ] name The name.
|
403
|
-
#
|
404
|
-
# @return [ Symbol ] The value as a symbol.
|
405
|
-
#
|
406
|
-
# @since 3.1.0
|
407
|
-
def __evaluate__(name)
|
408
|
-
name.respond_to?(:call) ? name.call.to_sym : name.to_sym
|
409
|
-
end
|
410
|
-
|
411
|
-
# Get the name of the current database to use. Will check for a session
|
412
|
-
# override with a database first, then database name.
|
413
|
-
#
|
414
|
-
# @api private
|
415
|
-
#
|
416
|
-
# @example Get the current database name.
|
417
|
-
# Model.current_database_name
|
418
|
-
#
|
419
|
-
# @param [ Moped::Session ] session The current session.
|
420
|
-
#
|
421
|
-
# @return [ Symbol ] The current database name.
|
422
|
-
#
|
423
|
-
# @since 3.1.0
|
424
|
-
def current_database_name(session)
|
425
|
-
if session_override && name = session.options[:database]
|
426
|
-
name
|
427
|
-
else
|
428
|
-
database_name
|
429
|
-
end
|
120
|
+
def collection
|
121
|
+
mongo_session[collection_name]
|
430
122
|
end
|
431
123
|
end
|
432
124
|
end
|