mongoid 3.1.7 → 4.0.0.alpha1
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 +317 -11
- data/README.md +4 -5
- data/lib/config/locales/en.yml +9 -12
- data/lib/mongoid.rb +6 -75
- data/lib/mongoid/atomic.rb +0 -11
- data/lib/mongoid/atomic/paths/embedded.rb +0 -30
- data/lib/mongoid/atomic/paths/root.rb +0 -13
- data/lib/mongoid/attributes.rb +30 -108
- 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} +5 -2
- data/lib/mongoid/composable.rb +104 -0
- data/lib/mongoid/config.rb +3 -9
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/contextual/aggregable/mongo.rb +5 -9
- data/lib/mongoid/contextual/atomic.rb +53 -53
- data/lib/mongoid/contextual/command.rb +26 -0
- data/lib/mongoid/contextual/map_reduce.rb +1 -1
- data/lib/mongoid/contextual/memory.rb +6 -5
- data/lib/mongoid/contextual/mongo.rb +59 -28
- data/lib/mongoid/contextual/text_search.rb +180 -0
- data/lib/mongoid/copyable.rb +2 -3
- data/lib/mongoid/criteria.rb +13 -33
- data/lib/mongoid/criteria/{#findable.rb# → findable.rb} +0 -2
- 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 +1 -1
- data/lib/mongoid/{criterion/scoping.rb → criteria/scopable.rb} +2 -2
- data/lib/mongoid/document.rb +28 -12
- data/lib/mongoid/errors.rb +1 -1
- data/lib/mongoid/errors/document_not_found.rb +2 -1
- data/lib/mongoid/errors/invalid_value.rb +16 -0
- data/lib/mongoid/errors/mongoid_error.rb +1 -1
- data/lib/mongoid/extensions.rb +2 -7
- data/lib/mongoid/extensions/array.rb +2 -2
- data/lib/mongoid/extensions/boolean.rb +14 -17
- data/lib/mongoid/extensions/float.rb +1 -0
- data/lib/mongoid/extensions/hash.rb +1 -1
- data/lib/mongoid/extensions/object.rb +4 -4
- data/lib/mongoid/extensions/object_id.rb +5 -5
- data/lib/mongoid/extensions/range.rb +8 -2
- data/lib/mongoid/extensions/string.rb +5 -17
- data/lib/mongoid/extensions/time.rb +2 -2
- data/lib/mongoid/factory.rb +3 -3
- data/lib/mongoid/fields.rb +9 -8
- data/lib/mongoid/fields/foreign_key.rb +3 -3
- data/lib/mongoid/fields/standard.rb +4 -16
- data/lib/mongoid/fields/validators/macro.rb +11 -3
- data/lib/mongoid/{finders.rb → findable.rb} +6 -2
- 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} +3 -52
- data/lib/mongoid/log_subscriber.rb +22 -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 +1 -1
- data/lib/mongoid/{matchers → matchable}/nin.rb +3 -2
- data/lib/mongoid/{matchers → matchable}/or.rb +2 -2
- data/lib/mongoid/{matchers → matchable}/size.rb +1 -1
- data/lib/mongoid/persistable.rb +212 -0
- data/lib/mongoid/persistable/creatable.rb +188 -0
- data/lib/mongoid/persistable/deletable.rb +148 -0
- data/lib/mongoid/persistable/destroyable.rb +55 -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 +151 -0
- data/lib/mongoid/persistable/upsertable.rb +55 -0
- data/lib/mongoid/positional.rb +71 -0
- data/lib/mongoid/railtie.rb +32 -45
- data/lib/mongoid/railties/database.rake +12 -6
- data/lib/mongoid/relations.rb +3 -3
- data/lib/mongoid/relations/accessors.rb +13 -46
- data/lib/mongoid/relations/auto_save.rb +15 -36
- data/lib/mongoid/relations/binding.rb +0 -23
- 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.rb +2 -2
- 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/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 +47 -0
- data/lib/mongoid/relations/eager/base.rb +57 -0
- data/lib/mongoid/relations/eager/belongs_to.rb +30 -0
- data/lib/mongoid/relations/eager/has_and_belongs_to_many.rb +40 -0
- data/lib/mongoid/relations/eager/has_many.rb +37 -0
- data/lib/mongoid/relations/eager/has_one.rb +29 -0
- data/lib/mongoid/relations/embedded/batchable.rb +3 -4
- data/lib/mongoid/relations/embedded/many.rb +7 -27
- data/lib/mongoid/relations/macros.rb +2 -4
- data/lib/mongoid/relations/many.rb +30 -31
- data/lib/mongoid/relations/metadata.rb +6 -75
- 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 +10 -32
- data/lib/mongoid/relations/referenced/in.rb +2 -18
- data/lib/mongoid/relations/referenced/many.rb +9 -22
- data/lib/mongoid/relations/referenced/many_to_many.rb +10 -33
- data/lib/mongoid/relations/referenced/one.rb +2 -21
- data/lib/mongoid/relations/synchronization.rb +3 -3
- data/lib/mongoid/relations/touchable.rb +33 -0
- data/lib/mongoid/{reloading.rb → reloadable.rb} +6 -4
- data/lib/mongoid/{scoping.rb → scopable.rb} +26 -3
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/{serialization.rb → serializable.rb} +10 -1
- data/lib/mongoid/sessions.rb +37 -345
- data/lib/mongoid/sessions/factory.rb +2 -0
- data/lib/mongoid/sessions/options.rb +176 -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 +15 -1
- data/lib/mongoid/{sharding.rb → shardable.rb} +5 -1
- data/lib/mongoid/support/query_counter.rb +23 -0
- data/lib/mongoid/threaded.rb +0 -110
- data/lib/mongoid/threaded/lifecycle.rb +0 -28
- data/lib/mongoid/timestamps/updated/short.rb +2 -2
- data/lib/mongoid/{hierarchy.rb → traversable.rb} +9 -5
- data/lib/mongoid/{validations.rb → validatable.rb} +23 -9
- data/lib/mongoid/{validations → validatable}/associated.rb +3 -1
- 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 +3 -3
- data/lib/mongoid/version.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +9 -13
- 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 +59 -57
- data/lib/support/ruby_version.rb +1 -1
- data/spec/app/models/account.rb +2 -6
- data/spec/app/models/acolyte.rb +1 -0
- data/spec/app/models/actor.rb +0 -1
- data/spec/app/models/address.rb +6 -1
- data/spec/app/models/animal.rb +1 -1
- data/spec/app/models/appointment.rb +2 -2
- 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/dragon.rb +4 -0
- data/spec/app/models/drug.rb +1 -3
- data/spec/app/models/dungeon.rb +4 -0
- 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 +0 -2
- 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/login.rb +1 -1
- data/spec/app/models/movie.rb +1 -0
- data/spec/app/models/name.rb +3 -3
- data/spec/app/models/note.rb +1 -1
- data/spec/app/models/oscar.rb +1 -1
- data/spec/app/models/parent_doc.rb +1 -1
- data/spec/app/models/person.rb +13 -8
- data/spec/app/models/phone.rb +1 -3
- data/spec/app/models/player.rb +1 -1
- data/spec/app/models/post.rb +2 -1
- data/spec/app/models/quiz.rb +0 -3
- data/spec/app/models/record.rb +5 -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/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 +1 -1
- data/spec/app/models/video.rb +0 -4
- data/spec/app/models/wiki_page.rb +1 -4
- 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 +16 -16
- data/spec/mongoid/attributes_spec.rb +188 -434
- data/spec/mongoid/{dirty_spec.rb → changeable_spec.rb} +117 -148
- data/spec/mongoid/{components_spec.rb → composable_spec.rb} +3 -3
- data/spec/mongoid/config/environment_spec.rb +3 -3
- data/spec/mongoid/config/options_spec.rb +6 -6
- data/spec/mongoid/config_spec.rb +24 -48
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +12 -12
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +46 -38
- data/spec/mongoid/contextual/atomic_spec.rb +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 +94 -94
- data/spec/mongoid/contextual/mongo_spec.rb +225 -139
- data/spec/mongoid/contextual/text_search_spec.rb +207 -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 +1063 -0
- data/spec/mongoid/{criterion/scoping_spec.rb → criteria/scopable_spec.rb} +31 -31
- data/spec/mongoid/criteria_spec.rb +530 -2207
- 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_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 +3 -3
- 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 +7 -7
- 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/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 +9 -9
- 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 +23 -23
- data/spec/mongoid/fields/standard_spec.rb +12 -12
- data/spec/mongoid/fields_spec.rb +168 -209
- data/spec/mongoid/{finders_spec.rb → findable_spec.rb} +62 -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} +105 -105
- data/spec/mongoid/log_subscriber_spec.rb +74 -0
- data/spec/mongoid/loggable_spec.rb +1 -1
- data/spec/mongoid/{matchers → matchable}/all_spec.rb +4 -4
- data/spec/mongoid/{matchers → matchable}/and_spec.rb +11 -11
- data/spec/mongoid/{matchers → matchable}/default_spec.rb +15 -15
- data/spec/mongoid/{matchers → matchable}/exists_spec.rb +5 -5
- data/spec/mongoid/{matchers → matchable}/gt_spec.rb +9 -8
- data/spec/mongoid/{matchers → matchable}/gte_spec.rb +7 -7
- data/spec/mongoid/matchable/in_spec.rb +49 -0
- data/spec/mongoid/{matchers → matchable}/lt_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/lte_spec.rb +7 -7
- data/spec/mongoid/{matchers → matchable}/ne_spec.rb +3 -3
- data/spec/mongoid/matchable/nin_spec.rb +48 -0
- data/spec/mongoid/{matchers → matchable}/or_spec.rb +6 -6
- data/spec/mongoid/{matchers → matchable}/size_spec.rb +3 -3
- data/spec/mongoid/{matchers_spec.rb → matchable_spec.rb} +41 -41
- data/spec/mongoid/persistable/creatable_spec.rb +512 -0
- data/spec/mongoid/persistable/deletable_spec.rb +205 -0
- data/spec/mongoid/persistable/destroyable_spec.rb +148 -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 +432 -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} +19 -14
- 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 +36 -16
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +6 -6
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +2 -2
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +3 -3
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +12 -12
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +6 -6
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +9 -9
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +6 -6
- 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 +22 -33
- 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 +11 -24
- data/spec/mongoid/relations/builders_spec.rb +21 -21
- data/spec/mongoid/relations/cascading/delete_spec.rb +7 -7
- data/spec/mongoid/relations/cascading/destroy_spec.rb +2 -2
- data/spec/mongoid/relations/cascading/nullify_spec.rb +2 -2
- data/spec/mongoid/relations/cascading/restrict_spec.rb +3 -3
- 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 +143 -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 +55 -56
- data/spec/mongoid/relations/embedded/many_spec.rb +357 -367
- data/spec/mongoid/relations/embedded/one_spec.rb +98 -139
- data/spec/mongoid/relations/macros_spec.rb +108 -102
- data/spec/mongoid/relations/metadata_spec.rb +147 -241
- 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 +379 -522
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +345 -417
- data/spec/mongoid/relations/referenced/one_spec.rb +148 -263
- 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 +116 -116
- data/spec/mongoid/relations/touchable_spec.rb +296 -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} +74 -126
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/{serialization_spec.rb → serializable_spec.rb} +111 -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 +92 -0
- data/spec/mongoid/sessions_spec.rb +288 -177
- data/spec/mongoid/{sharding_spec.rb → shardable_spec.rb} +8 -8
- data/spec/mongoid/state_spec.rb +10 -10
- 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/updated/short_spec.rb +10 -10
- data/spec/mongoid/timestamps/updated_spec.rb +8 -12
- data/spec/mongoid/timestamps_spec.rb +7 -11
- data/spec/mongoid/{hierarchy_spec.rb → traversable_spec.rb} +19 -19
- data/spec/mongoid/{validations → validatable}/associated_spec.rb +18 -18
- data/spec/mongoid/{validations → validatable}/format_spec.rb +6 -6
- data/spec/mongoid/{validations → validatable}/length_spec.rb +7 -7
- data/spec/mongoid/{validations → validatable}/numericality_spec.rb +1 -1
- data/spec/mongoid/{validations → validatable}/presence_spec.rb +31 -38
- data/spec/mongoid/{validations → validatable}/uniqueness_spec.rb +126 -183
- data/spec/mongoid/{validations_spec.rb → validatable_spec.rb} +28 -28
- data/spec/mongoid_spec.rb +8 -8
- data/spec/rails/mongoid_spec.rb +72 -87
- data/spec/spec_helper.rb +19 -17
- metadata +261 -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/criterion/findable.rb +0 -179
- 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/draft.rb +0 -9
- 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/#atomic_spec.rb# +0 -365
- 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/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
@@ -14,49 +14,23 @@ module Mongoid
|
|
14
14
|
# person.process_attributes(:title => "sir", :age => 40)
|
15
15
|
#
|
16
16
|
# @param [ Hash ] attrs The attributes to set.
|
17
|
-
# @param [ Symbol ] role A role for scoped mass assignment.
|
18
|
-
# @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
|
19
17
|
#
|
20
18
|
# @since 2.0.0.rc.7
|
21
|
-
def process_attributes(attrs = nil
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
process_attribute(key, value)
|
29
|
-
end
|
19
|
+
def process_attributes(attrs = nil)
|
20
|
+
attrs ||= {}
|
21
|
+
if !attrs.empty?
|
22
|
+
attrs = sanitize_for_mass_assignment(attrs)
|
23
|
+
attrs.each_pair do |key, value|
|
24
|
+
next if pending_attribute?(key, value)
|
25
|
+
process_attribute(key, value)
|
30
26
|
end
|
31
|
-
yield self if block_given?
|
32
|
-
process_pending
|
33
27
|
end
|
28
|
+
yield self if block_given?
|
29
|
+
process_pending
|
34
30
|
end
|
35
31
|
|
36
32
|
private
|
37
33
|
|
38
|
-
# Get the current mass assignment options for this model.
|
39
|
-
#
|
40
|
-
# @api private
|
41
|
-
#
|
42
|
-
# @return [ Hash ] The mass assignment options.
|
43
|
-
#
|
44
|
-
# @since 3.0.7
|
45
|
-
def mass_assignment_options
|
46
|
-
@mass_assignment_options ||= {}
|
47
|
-
end
|
48
|
-
|
49
|
-
# Set the mass assignment options for the current model.
|
50
|
-
#
|
51
|
-
# @api private
|
52
|
-
#
|
53
|
-
# @return [ Hash ] The mass assignment options.
|
54
|
-
#
|
55
|
-
# @since 3.0.7
|
56
|
-
def mass_assignment_options=(options)
|
57
|
-
@mass_assignment_options = options
|
58
|
-
end
|
59
|
-
|
60
34
|
# If the key provided is the name of a relation or a nested attribute, we
|
61
35
|
# need to wait until all other attributes are set before processing
|
62
36
|
# these.
|
@@ -118,14 +92,9 @@ module Mongoid
|
|
118
92
|
#
|
119
93
|
# @since 2.0.0.rc.7
|
120
94
|
def process_attribute(name, value)
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
write_attribute(name, value)
|
125
|
-
else
|
126
|
-
raise Errors::UnknownAttribute.new(self.class, name) unless responds
|
127
|
-
send(writer_method, value)
|
128
|
-
end
|
95
|
+
responds = respond_to?("#{name}=")
|
96
|
+
raise Errors::UnknownAttribute.new(self.class, name) unless responds
|
97
|
+
send("#{name}=", value)
|
129
98
|
end
|
130
99
|
|
131
100
|
# Process all the pending nested attributes that needed to wait until
|
@@ -167,34 +136,12 @@ module Mongoid
|
|
167
136
|
pending_relations.each_pair do |name, value|
|
168
137
|
metadata = relations[name]
|
169
138
|
if value.is_a?(Hash)
|
170
|
-
metadata.nested_builder(value, {}).build(self
|
139
|
+
metadata.nested_builder(value, {}).build(self)
|
171
140
|
else
|
172
141
|
send("#{name}=", value)
|
173
142
|
end
|
174
143
|
end
|
175
144
|
end
|
176
|
-
|
177
|
-
# Execute the block with the provided mass assignment options set.
|
178
|
-
#
|
179
|
-
# @api private
|
180
|
-
#
|
181
|
-
# @example Execute with mass assignment.
|
182
|
-
# model.with_mass_assignment(:default, true)
|
183
|
-
#
|
184
|
-
# @param [ Symbol ] role The role.
|
185
|
-
# @param [ true, false ] guard_protected_attributes To enable mass
|
186
|
-
# assignment.
|
187
|
-
#
|
188
|
-
# @since 3.0.7
|
189
|
-
def with_mass_assignment(role, guard_protected_attributes)
|
190
|
-
begin
|
191
|
-
self.mass_assignment_options =
|
192
|
-
{ as: role, without_protection: !guard_protected_attributes }
|
193
|
-
yield
|
194
|
-
ensure
|
195
|
-
self.mass_assignment_options = nil
|
196
|
-
end
|
197
|
-
end
|
198
145
|
end
|
199
146
|
end
|
200
147
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module Mongoid
|
3
|
-
|
3
|
+
|
4
|
+
# Defines behaviour for dirty tracking.
|
5
|
+
#
|
6
|
+
# @since 4.0.0
|
7
|
+
module Changeable
|
4
8
|
extend ActiveSupport::Concern
|
5
9
|
|
6
10
|
# Get the changed attributes for the document.
|
@@ -80,7 +84,6 @@ module Mongoid
|
|
80
84
|
#
|
81
85
|
# @since 2.1.0
|
82
86
|
def move_changes
|
83
|
-
@_children = nil
|
84
87
|
@previous_changes = changes
|
85
88
|
Atomic::UPDATES.each do |update|
|
86
89
|
send(update).clear
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/changeable"
|
3
|
+
require "mongoid/findable"
|
4
|
+
require "mongoid/indexable"
|
5
|
+
require "mongoid/inspectable"
|
6
|
+
require "mongoid/interceptable"
|
7
|
+
require "mongoid/matchable"
|
8
|
+
require "mongoid/persistable"
|
9
|
+
require "mongoid/reloadable"
|
10
|
+
require "mongoid/selectable"
|
11
|
+
require "mongoid/scopable"
|
12
|
+
require "mongoid/serializable"
|
13
|
+
require "mongoid/shardable"
|
14
|
+
require "mongoid/traversable"
|
15
|
+
require "mongoid/validatable"
|
16
|
+
|
17
|
+
module Mongoid
|
18
|
+
|
19
|
+
# This module provides inclusions of all behaviour in a Mongoid document.
|
20
|
+
#
|
21
|
+
# @since 4.0.0
|
22
|
+
module Composable
|
23
|
+
extend ActiveSupport::Concern
|
24
|
+
|
25
|
+
# All modules that a +Document+ is composed of are defined in this
|
26
|
+
# module, to keep the document class from getting too cluttered.
|
27
|
+
included do
|
28
|
+
extend ActiveModel::Translation
|
29
|
+
extend Findable
|
30
|
+
end
|
31
|
+
|
32
|
+
include ActiveModel::Conversion
|
33
|
+
include ActiveModel::ForbiddenAttributesProtection
|
34
|
+
include ActiveModel::Naming
|
35
|
+
include ActiveModel::Serializers::JSON
|
36
|
+
include ActiveModel::Serializers::Xml
|
37
|
+
include Atomic
|
38
|
+
include Changeable
|
39
|
+
include Attributes
|
40
|
+
include Evolvable
|
41
|
+
include Fields
|
42
|
+
include Indexable
|
43
|
+
include Inspectable
|
44
|
+
include Matchable
|
45
|
+
include Persistable
|
46
|
+
include Relations
|
47
|
+
include Reloadable
|
48
|
+
include Scopable
|
49
|
+
include Selectable
|
50
|
+
include Serializable
|
51
|
+
include Sessions
|
52
|
+
include Shardable
|
53
|
+
include State
|
54
|
+
include Threaded::Lifecycle
|
55
|
+
include Traversable
|
56
|
+
include Validatable
|
57
|
+
include Interceptable
|
58
|
+
include Copyable
|
59
|
+
include Equality
|
60
|
+
|
61
|
+
MODULES = [
|
62
|
+
Atomic,
|
63
|
+
Attributes,
|
64
|
+
Copyable,
|
65
|
+
Changeable,
|
66
|
+
Evolvable,
|
67
|
+
Fields,
|
68
|
+
Indexable,
|
69
|
+
Inspectable,
|
70
|
+
Interceptable,
|
71
|
+
Matchable,
|
72
|
+
Persistable,
|
73
|
+
Relations,
|
74
|
+
Reloadable,
|
75
|
+
Scopable,
|
76
|
+
Serializable,
|
77
|
+
Sessions,
|
78
|
+
Shardable,
|
79
|
+
State,
|
80
|
+
Threaded::Lifecycle,
|
81
|
+
Traversable,
|
82
|
+
Validatable,
|
83
|
+
Equality
|
84
|
+
]
|
85
|
+
|
86
|
+
class << self
|
87
|
+
|
88
|
+
# Get a list of methods that would be a bad idea to define as field names
|
89
|
+
# or override when including Mongoid::Document.
|
90
|
+
#
|
91
|
+
# @example Bad thing!
|
92
|
+
# Mongoid::Components.prohibited_methods
|
93
|
+
#
|
94
|
+
# @return [ Array<Symbol> ]
|
95
|
+
#
|
96
|
+
# @since 2.1.8
|
97
|
+
def prohibited_methods
|
98
|
+
@prohibited_methods ||= MODULES.flat_map do |mod|
|
99
|
+
mod.instance_methods.map{ |m| m.to_sym }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/lib/mongoid/config.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "mongoid/config/environment"
|
3
|
-
require "mongoid/config/inflections"
|
4
3
|
require "mongoid/config/options"
|
5
4
|
require "mongoid/config/validators"
|
6
5
|
|
@@ -11,23 +10,18 @@ module Mongoid
|
|
11
10
|
module Config
|
12
11
|
extend self
|
13
12
|
extend Options
|
14
|
-
include ActiveModel::Observing
|
15
13
|
|
16
14
|
delegate :logger=, to: ::Mongoid
|
17
15
|
delegate :logger, to: ::Mongoid
|
18
16
|
|
19
17
|
LOCK = Mutex.new
|
20
18
|
|
21
|
-
option :allow_dynamic_fields, default: true
|
22
|
-
option :identity_map_enabled, default: false
|
23
19
|
option :include_root_in_json, default: false
|
24
20
|
option :include_type_for_serialization, default: false
|
25
21
|
option :preload_models, default: false
|
26
|
-
option :protect_sensitive_fields, default: true
|
27
22
|
option :raise_not_found_error, default: true
|
28
23
|
option :scope_overwrite_exception, default: false
|
29
|
-
|
30
|
-
option :skip_version_check, default: false
|
24
|
+
option :duplicate_fields_exception, default: false
|
31
25
|
option :use_activesupport_time_zone, default: true
|
32
26
|
option :use_utc, default: false
|
33
27
|
|
@@ -54,7 +48,7 @@ module Mongoid
|
|
54
48
|
# @param [ String ] name The database name.
|
55
49
|
#
|
56
50
|
# @since 3.0.0
|
57
|
-
def connect_to(name, options = {
|
51
|
+
def connect_to(name, options = { read: :primary })
|
58
52
|
self.sessions = {
|
59
53
|
default: {
|
60
54
|
database: name,
|
@@ -72,7 +66,7 @@ module Mongoid
|
|
72
66
|
#
|
73
67
|
# @return [ Array<String> ] An array of bad field names.
|
74
68
|
def destructive_fields
|
75
|
-
|
69
|
+
Composable.prohibited_methods
|
76
70
|
end
|
77
71
|
|
78
72
|
# Load the settings from a compliant mongoid.yml file. This can be used for
|
@@ -20,7 +20,7 @@ module Mongoid
|
|
20
20
|
# Define a configuration option with a default.
|
21
21
|
#
|
22
22
|
# @example Define the option.
|
23
|
-
# Options.option(:persist_in_safe_mode, :default =>
|
23
|
+
# Options.option(:persist_in_safe_mode, :default => true)
|
24
24
|
#
|
25
25
|
# @param [ Symbol ] name The name of the configuration option.
|
26
26
|
# @param [ Hash ] options Extras for the option.
|
@@ -12,7 +12,7 @@ module Mongoid
|
|
12
12
|
#
|
13
13
|
# @param [ String, Symbol ] field The field name.
|
14
14
|
#
|
15
|
-
# @return [ Hash ]
|
15
|
+
# @return [ Hash ] count is a number of documents with the provided field. If there're none, then count is 0 and max, min, sum, avg are nil.
|
16
16
|
# {
|
17
17
|
# "count" => 2.0,
|
18
18
|
# "max" => 1000.0,
|
@@ -23,15 +23,11 @@ module Mongoid
|
|
23
23
|
#
|
24
24
|
# @since 3.0.0
|
25
25
|
def aggregates(field)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
{ "count" => query.count, "avg" => 0, "sum" => 0 }
|
30
|
-
else
|
31
|
-
result.first
|
32
|
-
end
|
26
|
+
result = collection.aggregate(pipeline(field)).to_a
|
27
|
+
if result.empty?
|
28
|
+
{ "count" => 0, "sum" => nil, "avg" => nil, "min" => nil, "max" => nil }
|
33
29
|
else
|
34
|
-
|
30
|
+
result.first
|
35
31
|
end
|
36
32
|
end
|
37
33
|
|
@@ -6,84 +6,76 @@ module Mongoid
|
|
6
6
|
# Execute an atomic $addToSet on the matching documents.
|
7
7
|
#
|
8
8
|
# @example Add the value to the set.
|
9
|
-
# context.add_to_set(:
|
9
|
+
# context.add_to_set(members: "Dave", genres: "Electro")
|
10
10
|
#
|
11
|
-
# @param [
|
12
|
-
# @param [ Object ] value The single value to add.
|
11
|
+
# @param [ Hash ] adds The operations.
|
13
12
|
#
|
14
13
|
# @return [ nil ] Nil.
|
15
14
|
#
|
16
15
|
# @since 3.0.0
|
17
|
-
def add_to_set(
|
18
|
-
query.update_all("$addToSet" =>
|
16
|
+
def add_to_set(adds)
|
17
|
+
query.update_all("$addToSet" => collect_operations(adds))
|
19
18
|
end
|
20
19
|
|
21
20
|
# Perform an atomic $bit operation on the matching documents.
|
22
21
|
#
|
23
22
|
# @example Perform the bitwise op.
|
24
|
-
# context.bit(:
|
23
|
+
# context.bit(likes: { and: 14, or: 4 })
|
25
24
|
#
|
26
|
-
# @param [
|
27
|
-
# @param [ Hash ] value The bitwise operations to perform. Keys may be
|
28
|
-
# "and" or "or" and must have numeric values.
|
25
|
+
# @param [ Hash ] bits The operations.
|
29
26
|
#
|
30
27
|
# @return [ nil ] Nil.
|
31
28
|
#
|
32
29
|
# @since 3.0.0
|
33
|
-
def bit(
|
34
|
-
query.update_all("$bit" =>
|
30
|
+
def bit(bits)
|
31
|
+
query.update_all("$bit" => collect_operations(bits))
|
35
32
|
end
|
36
33
|
|
37
34
|
# Perform an atomic $inc operation on the matching documents.
|
38
35
|
#
|
39
36
|
# @example Perform the atomic increment.
|
40
|
-
# context.inc(:
|
37
|
+
# context.inc(likes: 10)
|
41
38
|
#
|
42
|
-
# @param [
|
43
|
-
# @param [ Integer ] value The amount to increment by.
|
39
|
+
# @param [ Hash ] incs The operations.
|
44
40
|
#
|
45
41
|
# @return [ nil ] Nil.
|
46
42
|
#
|
47
43
|
# @since 3.0.0
|
48
|
-
def inc(
|
49
|
-
query.update_all("$inc" =>
|
44
|
+
def inc(incs)
|
45
|
+
query.update_all("$inc" => collect_operations(incs))
|
50
46
|
end
|
51
47
|
|
52
48
|
# Perform an atomic $pop operation on the matching documents.
|
53
49
|
#
|
54
50
|
# @example Pop the first value on the matches.
|
55
|
-
# context.pop(:
|
51
|
+
# context.pop(members: -1)
|
56
52
|
#
|
57
53
|
# @example Pop the last value on the matches.
|
58
|
-
# context.pop(:
|
54
|
+
# context.pop(members: 1)
|
59
55
|
#
|
60
|
-
# @param [
|
61
|
-
# from.
|
62
|
-
# @param [ Integer ] value 1 to pop from the end, -1 to pop from the
|
63
|
-
# front.
|
56
|
+
# @param [ Hash ] pops The operations.
|
64
57
|
#
|
65
58
|
# @return [ nil ] Nil.
|
66
59
|
#
|
67
60
|
# @since 3.0.0
|
68
|
-
def pop(
|
69
|
-
query.update_all("$pop" =>
|
61
|
+
def pop(pops)
|
62
|
+
query.update_all("$pop" => collect_operations(pops))
|
70
63
|
end
|
71
64
|
|
72
65
|
# Perform an atomic $pull operation on the matching documents.
|
73
66
|
#
|
74
67
|
# @example Pull the value from the matches.
|
75
|
-
# context.pull(:
|
68
|
+
# context.pull(members: "Dave")
|
76
69
|
#
|
77
70
|
# @note Expression pulling is not yet supported.
|
78
71
|
#
|
79
|
-
# @param [
|
80
|
-
# @param [ Object ] value The single value to pull.
|
72
|
+
# @param [ Hash ] pulls The operations.
|
81
73
|
#
|
82
74
|
# @return [ nil ] Nil.
|
83
75
|
#
|
84
76
|
# @since 3.0.0
|
85
|
-
def pull(
|
86
|
-
query.update_all("$pull" =>
|
77
|
+
def pull(pulls)
|
78
|
+
query.update_all("$pull" => collect_operations(pulls))
|
87
79
|
end
|
88
80
|
|
89
81
|
# Perform an atomic $pullAll operation on the matching documents.
|
@@ -91,74 +83,73 @@ module Mongoid
|
|
91
83
|
# @example Pull all the matching values from the matches.
|
92
84
|
# context.pull_all(:members, [ "Alan", "Vince" ])
|
93
85
|
#
|
94
|
-
# @param [
|
95
|
-
# @param [ Array<Object> ] values The values to pull.
|
86
|
+
# @param [ Hash ] pulls The operations.
|
96
87
|
#
|
97
88
|
# @return [ nil ] Nil.
|
98
89
|
#
|
99
90
|
# @since 3.0.0
|
100
|
-
def pull_all(
|
101
|
-
query.update_all("$pullAll" =>
|
91
|
+
def pull_all(pulls)
|
92
|
+
query.update_all("$pullAll" => collect_operations(pulls))
|
102
93
|
end
|
103
94
|
|
104
95
|
# Perform an atomic $push operation on the matching documents.
|
105
96
|
#
|
106
97
|
# @example Push the value to the matching docs.
|
107
|
-
# context.push(:
|
98
|
+
# context.push(members: "Alan")
|
108
99
|
#
|
109
|
-
# @param [
|
110
|
-
# @param [ Object ] value The value to push.
|
100
|
+
# @param [ Hash ] pushes The operations.
|
111
101
|
#
|
112
102
|
# @return [ nil ] Nil.
|
113
103
|
#
|
114
104
|
# @since 3.0.0
|
115
|
-
def push(
|
116
|
-
query.update_all("$push" =>
|
105
|
+
def push(pushes)
|
106
|
+
query.update_all("$push" => collect_operations(pushes))
|
117
107
|
end
|
118
108
|
|
119
109
|
# Perform an atomic $pushAll operation on the matching documents.
|
120
110
|
#
|
121
111
|
# @example Push the values to the matching docs.
|
122
|
-
# context.push(:
|
112
|
+
# context.push(members: [ "Alan", "Fletch" ])
|
123
113
|
#
|
124
|
-
# @param [
|
125
|
-
# @param [ Array<Object> ] values The values to push.
|
114
|
+
# @param [ Hash ] pushes The operations.
|
126
115
|
#
|
127
116
|
# @return [ nil ] Nil.
|
128
117
|
#
|
129
118
|
# @since 3.0.0
|
130
|
-
def push_all(
|
131
|
-
query.update_all("$pushAll" =>
|
119
|
+
def push_all(pushes)
|
120
|
+
query.update_all("$pushAll" => collect_operations(pushes))
|
132
121
|
end
|
133
122
|
|
134
123
|
# Perform an atomic $rename of fields on the matching documents.
|
135
124
|
#
|
136
125
|
# @example Rename the fields on the matching documents.
|
137
|
-
# context.rename(:
|
126
|
+
# context.rename(members: :artists)
|
138
127
|
#
|
139
|
-
# @param [
|
140
|
-
# @param [ String, Symbol ] new_name The new field name.
|
128
|
+
# @param [ Hash ] renames The operations.
|
141
129
|
#
|
142
130
|
# @return [ nil ] Nil.
|
143
131
|
#
|
144
132
|
# @since 3.0.0
|
145
|
-
def rename(
|
146
|
-
|
133
|
+
def rename(renames)
|
134
|
+
operations = renames.inject({}) do |ops, (old_name, new_name)|
|
135
|
+
ops[old_name] = new_name.to_s
|
136
|
+
ops
|
137
|
+
end
|
138
|
+
query.update_all("$rename" => collect_operations(operations))
|
147
139
|
end
|
148
140
|
|
149
141
|
# Perform an atomic $set of fields on the matching documents.
|
150
142
|
#
|
151
143
|
# @example Set the field value on the matches.
|
152
|
-
# context.set(:
|
144
|
+
# context.set(name: "Depeche Mode")
|
153
145
|
#
|
154
|
-
# @param [
|
155
|
-
# @param [ Object ] value The value to set.
|
146
|
+
# @param [ Hash ] sets The operations.
|
156
147
|
#
|
157
148
|
# @return [ nil ] Nil.
|
158
149
|
#
|
159
150
|
# @since 3.0.0
|
160
|
-
def set(
|
161
|
-
query.update_all("$set" =>
|
151
|
+
def set(sets)
|
152
|
+
query.update_all("$set" => collect_operations(sets))
|
162
153
|
end
|
163
154
|
|
164
155
|
# Perform an atomic $unset of a field on the matching documents.
|
@@ -175,6 +166,15 @@ module Mongoid
|
|
175
166
|
fields = args.__find_args__.collect { |f| [database_field_name(f), true] }
|
176
167
|
query.update_all("$unset" => Hash[fields])
|
177
168
|
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def collect_operations(ops)
|
173
|
+
ops.inject({}) do |operations, (field, value)|
|
174
|
+
operations[database_field_name(field)] = value.mongoize
|
175
|
+
operations
|
176
|
+
end
|
177
|
+
end
|
178
178
|
end
|
179
179
|
end
|
180
180
|
end
|