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
data/lib/mongoid/railtie.rb
CHANGED
@@ -7,20 +7,11 @@ require "rails/mongoid"
|
|
7
7
|
|
8
8
|
module Rails
|
9
9
|
module Mongoid
|
10
|
-
class Railtie < Rails::Railtie
|
11
10
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
# railtie.generators
|
17
|
-
#
|
18
|
-
# @return [ Symbol ] The method name to use.
|
19
|
-
#
|
20
|
-
# @since 2.0.0.rc.4
|
21
|
-
def self.generator
|
22
|
-
config.respond_to?(:app_generators) ? :app_generators : :generators
|
23
|
-
end
|
11
|
+
# Hooks Mongoid into Rails 3 and higher.
|
12
|
+
#
|
13
|
+
# @since 2.0.0
|
14
|
+
class Railtie < Rails::Railtie
|
24
15
|
|
25
16
|
# Mapping of rescued exceptions to HTTP responses
|
26
17
|
#
|
@@ -37,7 +28,7 @@ module Rails
|
|
37
28
|
}
|
38
29
|
end
|
39
30
|
|
40
|
-
config.
|
31
|
+
config.app_generators.orm :mongoid, migration: false
|
41
32
|
|
42
33
|
if config.action_dispatch.rescue_responses
|
43
34
|
config.action_dispatch.rescue_responses.merge!(rescue_responses)
|
@@ -56,11 +47,15 @@ module Rails
|
|
56
47
|
# config.mongoid.persist_in_safe_mode = true
|
57
48
|
# end
|
58
49
|
# end
|
50
|
+
#
|
51
|
+
# @since 2.0.0
|
59
52
|
config.mongoid = ::Mongoid::Config
|
60
53
|
|
61
54
|
# Initialize Mongoid. This will look for a mongoid.yml in the config
|
62
55
|
# directory and configure mongoid appropriately.
|
63
|
-
|
56
|
+
#
|
57
|
+
# @since 2.0.0
|
58
|
+
initializer "mongoid.load-config" do
|
64
59
|
config_file = Rails.root.join("config", "mongoid.yml")
|
65
60
|
if config_file.file?
|
66
61
|
begin
|
@@ -79,64 +74,41 @@ module Rails
|
|
79
74
|
|
80
75
|
# Set the proper error types for Rails. DocumentNotFound errors should be
|
81
76
|
# 404s and not 500s, validation errors are 422s.
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
77
|
+
#
|
78
|
+
# @since 2.0.0
|
79
|
+
config.after_initialize do
|
80
|
+
unless config.action_dispatch.rescue_responses
|
81
|
+
ActionDispatch::ShowExceptions.rescue_responses.update(Railtie.rescue_responses)
|
87
82
|
end
|
88
83
|
end
|
89
84
|
|
90
85
|
# Due to all models not getting loaded and messing up inheritance queries
|
91
86
|
# and indexing, we need to preload the models in order to address this.
|
92
87
|
#
|
93
|
-
# This will happen every request in development, once in
|
88
|
+
# This will happen for every request in development, once in other
|
94
89
|
# environments.
|
95
|
-
|
90
|
+
#
|
91
|
+
# @since 2.0.0
|
92
|
+
initializer "mongoid.preload-models" do |app|
|
96
93
|
config.to_prepare do
|
97
|
-
|
98
|
-
# We previously got rid of this, however in the case where
|
99
|
-
# threadsafe! is enabled we must load all models so things like
|
100
|
-
# creating indexes works properly.
|
101
|
-
::Rails::Mongoid.load_models(app)
|
102
|
-
else
|
103
|
-
::Rails::Mongoid.preload_models(app)
|
104
|
-
end
|
94
|
+
::Rails::Mongoid.preload_models(app)
|
105
95
|
end
|
106
96
|
end
|
107
97
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
initializer "instantiate observers" do
|
116
|
-
config.after_initialize do
|
117
|
-
::Mongoid::instantiate_observers
|
118
|
-
ActionDispatch::Reloader.to_prepare do
|
119
|
-
::Mongoid.instantiate_observers
|
120
|
-
end
|
98
|
+
config.after_initialize do
|
99
|
+
# Unicorn clears the START_CTX when a worker is forked, so if we have
|
100
|
+
# data in START_CTX then we know we're being preloaded. Unicorn does
|
101
|
+
# not provide application-level hooks for executing code after the
|
102
|
+
# process has forked, so we reconnect lazily.
|
103
|
+
if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
|
104
|
+
::Mongoid.default_session.disconnect if ::Mongoid.configured?
|
121
105
|
end
|
122
|
-
end
|
123
|
-
|
124
|
-
initializer "reconnect to master if application is preloaded" do
|
125
|
-
config.after_initialize do
|
126
|
-
# Unicorn clears the START_CTX when a worker is forked, so if we have
|
127
|
-
# data in START_CTX then we know we're being preloaded. Unicorn does
|
128
|
-
# not provide application-level hooks for executing code after the
|
129
|
-
# process has forked, so we reconnect lazily.
|
130
|
-
if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
|
131
|
-
::Mongoid.default_session.disconnect if ::Mongoid.configured?
|
132
|
-
end
|
133
106
|
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
107
|
+
# Passenger provides the :starting_worker_process event for executing
|
108
|
+
# code after it has forked, so we use that and reconnect immediately.
|
109
|
+
if ::Mongoid::Config.running_with_passenger?
|
110
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
111
|
+
::Mongoid.default_session.disconnect if forked
|
140
112
|
end
|
141
113
|
end
|
142
114
|
end
|
@@ -145,6 +117,8 @@ module Rails
|
|
145
117
|
# code, so we have no way in the intitializer to know if we are
|
146
118
|
# generating a mongoid.yml. So instead of failing, we catch all the
|
147
119
|
# errors and print them out.
|
120
|
+
#
|
121
|
+
# @since 3.0.0
|
148
122
|
def handle_configuration_error(e)
|
149
123
|
puts "There is a configuration error with the current mongoid.yml."
|
150
124
|
puts e.message
|
@@ -1,3 +1,5 @@
|
|
1
|
+
load 'mongoid/tasks/database.rake'
|
2
|
+
|
1
3
|
namespace :db do
|
2
4
|
|
3
5
|
unless Rake::Task.task_defined?("db:drop")
|
@@ -21,12 +23,12 @@ namespace :db do
|
|
21
23
|
|
22
24
|
unless Rake::Task.task_defined?("db:setup")
|
23
25
|
desc "Create the database, and initialize with the seed data"
|
24
|
-
task :setup => [ "db:create", "
|
26
|
+
task :setup => [ "db:create", "mongoid:create_indexes", "db:seed" ]
|
25
27
|
end
|
26
28
|
|
27
|
-
unless Rake::Task.task_defined?("db:
|
28
|
-
desc "Delete data and
|
29
|
-
task :
|
29
|
+
unless Rake::Task.task_defined?("db:reset")
|
30
|
+
desc "Delete data and loads the seeds"
|
31
|
+
task :reset => [ "db:drop", "db:seed" ]
|
30
32
|
end
|
31
33
|
|
32
34
|
unless Rake::Task.task_defined?("db:create")
|
@@ -51,9 +53,7 @@ namespace :db do
|
|
51
53
|
|
52
54
|
unless Rake::Task.task_defined?("db:test:prepare")
|
53
55
|
namespace :test do
|
54
|
-
task :prepare
|
55
|
-
# noop
|
56
|
-
end
|
56
|
+
task :prepare => "mongoid:create_indexes"
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -66,24 +66,8 @@ namespace :db do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
namespace :mongoid do
|
69
|
-
|
70
|
-
|
71
|
-
::Rails::Mongoid.create_indexes
|
72
|
-
end
|
73
|
-
|
74
|
-
desc "Remove the indexes defined on your mongoid models without questions!"
|
75
|
-
task :remove_indexes => :environment do
|
76
|
-
::Rails::Mongoid.remove_indexes
|
77
|
-
end
|
78
|
-
|
79
|
-
desc "Drops the database for the current Rails.env"
|
80
|
-
task :drop => :environment do
|
81
|
-
::Mongoid::Sessions.default.drop
|
82
|
-
end
|
83
|
-
|
84
|
-
desc "Drop all collections except the system collections"
|
85
|
-
task :purge => :environment do
|
86
|
-
::Mongoid.purge!
|
69
|
+
task :load_models do
|
70
|
+
::Rails.application.eager_load! if defined?(Rails)
|
87
71
|
end
|
88
72
|
end
|
89
73
|
end
|
data/lib/mongoid/relations.rb
CHANGED
@@ -46,7 +46,8 @@ module Mongoid
|
|
46
46
|
include Touchable
|
47
47
|
include CounterCache
|
48
48
|
|
49
|
-
attr_accessor :
|
49
|
+
attr_accessor :__metadata
|
50
|
+
alias :relation_metadata :__metadata
|
50
51
|
|
51
52
|
# Determine if the document itself is embedded in another document via the
|
52
53
|
# proper channels. (If it has a parent document.)
|
@@ -70,7 +71,7 @@ module Mongoid
|
|
70
71
|
#
|
71
72
|
# @since 2.0.0.rc.1
|
72
73
|
def embedded_many?
|
73
|
-
|
74
|
+
__metadata && __metadata.macro == :embeds_many
|
74
75
|
end
|
75
76
|
|
76
77
|
# Determine if the document is part of an embeds_one relation.
|
@@ -82,7 +83,7 @@ module Mongoid
|
|
82
83
|
#
|
83
84
|
# @since 2.0.0.rc.1
|
84
85
|
def embedded_one?
|
85
|
-
|
86
|
+
__metadata && __metadata.macro == :embeds_one
|
86
87
|
end
|
87
88
|
|
88
89
|
# Get the metadata name for this document. If no metadata was defined
|
@@ -97,8 +98,8 @@ module Mongoid
|
|
97
98
|
#
|
98
99
|
# @since 3.0.0
|
99
100
|
def metadata_name
|
100
|
-
raise Errors::NoMetadata.new(self.class.name) unless
|
101
|
-
|
101
|
+
raise Errors::NoMetadata.new(self.class.name) unless __metadata
|
102
|
+
__metadata.name
|
102
103
|
end
|
103
104
|
|
104
105
|
# Determine if the document is part of an references_many relation.
|
@@ -110,7 +111,7 @@ module Mongoid
|
|
110
111
|
#
|
111
112
|
# @since 2.0.0.rc.1
|
112
113
|
def referenced_many?
|
113
|
-
|
114
|
+
__metadata && __metadata.macro == :has_many
|
114
115
|
end
|
115
116
|
|
116
117
|
# Determine if the document is part of an references_one relation.
|
@@ -122,7 +123,7 @@ module Mongoid
|
|
122
123
|
#
|
123
124
|
# @since 2.0.0.rc.1
|
124
125
|
def referenced_one?
|
125
|
-
|
126
|
+
__metadata && __metadata.macro == :has_one
|
126
127
|
end
|
127
128
|
|
128
129
|
# Convenience method for iterating through the loaded relations and
|
@@ -136,27 +137,12 @@ module Mongoid
|
|
136
137
|
# @since 2.1.6
|
137
138
|
def reload_relations
|
138
139
|
relations.each_pair do |name, meta|
|
139
|
-
if instance_variable_defined?("
|
140
|
-
if _parent.nil? || instance_variable_get("
|
141
|
-
remove_instance_variable("
|
140
|
+
if instance_variable_defined?("@_#{name}")
|
141
|
+
if _parent.nil? || instance_variable_get("@_#{name}") != _parent
|
142
|
+
remove_instance_variable("@_#{name}")
|
142
143
|
end
|
143
144
|
end
|
144
145
|
end
|
145
146
|
end
|
146
|
-
|
147
|
-
module ClassMethods
|
148
|
-
|
149
|
-
# This is convenience for librarys still on the old API.
|
150
|
-
#
|
151
|
-
# @example Get the associations.
|
152
|
-
# Person.associations
|
153
|
-
#
|
154
|
-
# @return [ Hash ] The relations.
|
155
|
-
#
|
156
|
-
# @since 2.3.1
|
157
|
-
def associations
|
158
|
-
self.relations
|
159
|
-
end
|
160
|
-
end
|
161
147
|
end
|
162
148
|
end
|
@@ -12,10 +12,10 @@ module Mongoid
|
|
12
12
|
# document is nil, then sets the relation on this document.
|
13
13
|
#
|
14
14
|
# @example Build the relation.
|
15
|
-
# person.__build__(:addresses, { :
|
15
|
+
# person.__build__(:addresses, { :_id => 1 }, metadata)
|
16
16
|
#
|
17
17
|
# @param [ String, Symbol ] name The name of the relation.
|
18
|
-
# @param [ Hash,
|
18
|
+
# @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
|
19
19
|
# @param [ Metadata ] metadata The relation's metadata.
|
20
20
|
# @param [ true, false ] building If we are in a build operation.
|
21
21
|
#
|
@@ -44,20 +44,6 @@ module Mongoid
|
|
44
44
|
target ? metadata.relation.new(self, target, metadata) : nil
|
45
45
|
end
|
46
46
|
|
47
|
-
# Determines if the relation exists or not.
|
48
|
-
#
|
49
|
-
# @example Does the relation exist?
|
50
|
-
# person.relation_exists?(:people)
|
51
|
-
#
|
52
|
-
# @param [ String ] name The name of the relation to check.
|
53
|
-
#
|
54
|
-
# @return [ true, false ] True if set and not nil, false if not.
|
55
|
-
#
|
56
|
-
# @since 2.0.0.rc.1
|
57
|
-
def relation_exists?(name)
|
58
|
-
ivar(name)
|
59
|
-
end
|
60
|
-
|
61
47
|
# Resets the criteria inside the relation proxy. Used by many to many
|
62
48
|
# relations to keep the underlying ids array in sync.
|
63
49
|
#
|
@@ -68,7 +54,7 @@ module Mongoid
|
|
68
54
|
#
|
69
55
|
# @since 3.0.14
|
70
56
|
def reset_relation_criteria(name)
|
71
|
-
if instance_variable_defined?("
|
57
|
+
if instance_variable_defined?("@_#{name}")
|
72
58
|
send(name).reset_unloaded
|
73
59
|
end
|
74
60
|
end
|
@@ -86,7 +72,7 @@ module Mongoid
|
|
86
72
|
#
|
87
73
|
# @since 2.0.0.rc.1
|
88
74
|
def set_relation(name, relation)
|
89
|
-
instance_variable_set("
|
75
|
+
instance_variable_set("@_#{name}", relation)
|
90
76
|
end
|
91
77
|
|
92
78
|
private
|
@@ -106,34 +92,13 @@ module Mongoid
|
|
106
92
|
# @return [ Proxy ] The relation.
|
107
93
|
#
|
108
94
|
# @since 3.0.16
|
109
|
-
def get_relation(name, metadata, reload = false)
|
110
|
-
|
111
|
-
value = if instance_variable_defined?(variable) && !reload
|
112
|
-
instance_variable_get(variable)
|
113
|
-
else
|
114
|
-
_building do
|
115
|
-
_loading do
|
116
|
-
__build__(name, attributes[metadata.key], metadata)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
if value.nil? && metadata.autobuilding? && !without_autobuild?
|
121
|
-
send("build_#{name}")
|
122
|
-
else
|
95
|
+
def get_relation(name, metadata, object, reload = false)
|
96
|
+
if !reload && (value = ivar(name)) != false
|
123
97
|
value
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
# @todo: Durran: Refactor before release, but this fixes the issue with
|
128
|
-
# the extra queries.
|
129
|
-
def get_relation_for_set(name, metadata, object)
|
130
|
-
variable = "@#{name}"
|
131
|
-
value = if instance_variable_defined?(variable)
|
132
|
-
instance_variable_get(variable)
|
133
98
|
else
|
134
99
|
_building do
|
135
100
|
_loading do
|
136
|
-
if needs_no_database_query?(object, metadata)
|
101
|
+
if object && needs_no_database_query?(object, metadata)
|
137
102
|
__build__(name, object, metadata)
|
138
103
|
else
|
139
104
|
__build__(name, attributes[metadata.key], metadata)
|
@@ -145,7 +110,7 @@ module Mongoid
|
|
145
110
|
|
146
111
|
def needs_no_database_query?(object, metadata)
|
147
112
|
object.is_a?(Document) && !object.embedded? &&
|
148
|
-
object.
|
113
|
+
object._id == attributes[metadata.key]
|
149
114
|
end
|
150
115
|
|
151
116
|
# Is the current code executing without autobuild functionality?
|
@@ -190,12 +155,11 @@ module Mongoid
|
|
190
155
|
# person.game?
|
191
156
|
#
|
192
157
|
# @param [ String, Symbol ] name The name of the relation.
|
193
|
-
# @param [ Metadata ] The metadata.
|
194
158
|
#
|
195
159
|
# @return [ Class ] The model being set up.
|
196
160
|
#
|
197
161
|
# @since 3.0.0
|
198
|
-
def existence_check(name
|
162
|
+
def existence_check(name)
|
199
163
|
module_eval <<-END
|
200
164
|
def #{name}?
|
201
165
|
without_autobuild { !__send__(:#{name}).blank? }
|
@@ -220,7 +184,11 @@ module Mongoid
|
|
220
184
|
# @since 2.0.0.rc.1
|
221
185
|
def getter(name, metadata)
|
222
186
|
re_define_method(name) do |reload = false|
|
223
|
-
get_relation(name, metadata, reload)
|
187
|
+
value = get_relation(name, metadata, nil, reload)
|
188
|
+
if value.nil? && metadata.autobuilding? && !without_autobuild?
|
189
|
+
value = send("build_#{name}")
|
190
|
+
end
|
191
|
+
value
|
224
192
|
end
|
225
193
|
self
|
226
194
|
end
|
@@ -232,7 +200,6 @@ module Mongoid
|
|
232
200
|
# Person.ids_getter("addresses", metadata)
|
233
201
|
#
|
234
202
|
# @param [ String, Symbol ] name The name of the relation.
|
235
|
-
# @param [ Metadata] metadata The metadata for the relation.
|
236
203
|
#
|
237
204
|
# @return [ Class ] The class being set up.
|
238
205
|
def ids_getter(name, metadata)
|
@@ -243,7 +210,6 @@ module Mongoid
|
|
243
210
|
self
|
244
211
|
end
|
245
212
|
|
246
|
-
|
247
213
|
# Defines the setter for the relation. This does a few things based on
|
248
214
|
# some conditions. If there is an existing association, a target
|
249
215
|
# substitution will take place, otherwise a new relation will be
|
@@ -261,9 +227,7 @@ module Mongoid
|
|
261
227
|
def setter(name, metadata)
|
262
228
|
re_define_method("#{name}=") do |object|
|
263
229
|
without_autobuild do
|
264
|
-
if metadata
|
265
|
-
set_relation(name, get_relation(name, metadata).substitute(object.substitutable))
|
266
|
-
elsif value = get_relation_for_set(name, metadata, object)
|
230
|
+
if value = get_relation(name, metadata, object)
|
267
231
|
set_relation(name, value.substitute(object.substitutable))
|
268
232
|
else
|
269
233
|
__build__(name, object.substitutable, metadata)
|
@@ -7,11 +7,6 @@ module Mongoid
|
|
7
7
|
module AutoSave
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
-
included do
|
11
|
-
class_attribute :autosaved_relations
|
12
|
-
self.autosaved_relations = []
|
13
|
-
end
|
14
|
-
|
15
10
|
# Used to prevent infinite loops in associated autosaves.
|
16
11
|
#
|
17
12
|
# @example Is the document autosaved?
|
@@ -44,15 +39,8 @@ module Mongoid
|
|
44
39
|
# document.changed_for_autosave?
|
45
40
|
#
|
46
41
|
# @since 3.1.3
|
47
|
-
def changed_for_autosave?
|
48
|
-
new_record? || changed? || marked_for_destruction?
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns the relation, if it exists
|
52
|
-
#
|
53
|
-
# @since 3.1.3
|
54
|
-
def relation_changed_for_autosave(metadata)
|
55
|
-
ivar(metadata.name) if self.class.autosaved_relations.include?(metadata.name)
|
42
|
+
def changed_for_autosave?(doc)
|
43
|
+
doc.new_record? || doc.changed? || doc.marked_for_destruction?
|
56
44
|
end
|
57
45
|
|
58
46
|
module ClassMethods
|
@@ -68,39 +56,30 @@ module Mongoid
|
|
68
56
|
#
|
69
57
|
# @since 2.0.0.rc.1
|
70
58
|
def autosave(metadata)
|
71
|
-
if metadata.autosave? &&
|
72
|
-
|
73
|
-
|
74
|
-
|
59
|
+
if metadata.autosave? && !metadata.embedded?
|
60
|
+
save_method = :"autosave_documents_for_#{metadata.name}"
|
61
|
+
define_method(save_method) do
|
62
|
+
|
75
63
|
if before_callback_halted?
|
76
64
|
self.before_callback_halted = false
|
77
65
|
else
|
78
66
|
__autosaving__ do
|
79
|
-
if
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
67
|
+
if relation = ivar(metadata.name)
|
68
|
+
options = persistence_options || {}
|
69
|
+
if :belongs_to == metadata.macro
|
70
|
+
relation.with(options).save if changed_for_autosave?(relation)
|
71
|
+
else
|
72
|
+
Array(relation).each { |d| d.with(options).save if changed_for_autosave?(d) }
|
73
|
+
end
|
84
74
|
end
|
85
75
|
end
|
86
76
|
end
|
87
77
|
end
|
78
|
+
|
79
|
+
after_save save_method, unless: :autosaved?
|
88
80
|
end
|
89
81
|
end
|
90
82
|
|
91
|
-
# Can the autosave be added?
|
92
|
-
#
|
93
|
-
# @example Can the autosave be added?
|
94
|
-
# Person.autosavable?(metadata)
|
95
|
-
#
|
96
|
-
# @param [ Metadata ] metadata The relation metadata.
|
97
|
-
#
|
98
|
-
# @return [ true, false ] If the autosave is able to be added.
|
99
|
-
#
|
100
|
-
# @since 3.0.0
|
101
|
-
def autosavable?(metadata)
|
102
|
-
!autosaved_relations.include?(metadata.name) && !metadata.embedded?
|
103
|
-
end
|
104
83
|
end
|
105
84
|
end
|
106
85
|
end
|