mongoid_rails4 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3213 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +35 -0
- data/lib/config/locales/en.yml +448 -0
- data/lib/mongoid.rb +104 -0
- data/lib/mongoid/atomic.rb +384 -0
- data/lib/mongoid/atomic/modifiers.rb +317 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +28 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +39 -0
- data/lib/mongoid/attributes.rb +284 -0
- data/lib/mongoid/attributes/dynamic.rb +154 -0
- data/lib/mongoid/attributes/nested.rb +82 -0
- data/lib/mongoid/attributes/processing.rb +147 -0
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/changeable.rb +379 -0
- data/lib/mongoid/composable.rb +104 -0
- data/lib/mongoid/config.rb +263 -0
- data/lib/mongoid/config/environment.rb +44 -0
- data/lib/mongoid/config/options.rb +74 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +54 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +147 -0
- data/lib/mongoid/contextual/atomic.rb +180 -0
- data/lib/mongoid/contextual/command.rb +61 -0
- data/lib/mongoid/contextual/eager.rb +158 -0
- data/lib/mongoid/contextual/find_and_modify.rb +69 -0
- data/lib/mongoid/contextual/geo_near.rb +238 -0
- data/lib/mongoid/contextual/map_reduce.rb +324 -0
- data/lib/mongoid/contextual/memory.rb +440 -0
- data/lib/mongoid/contextual/mongo.rb +676 -0
- data/lib/mongoid/contextual/queryable.rb +25 -0
- data/lib/mongoid/contextual/text_search.rb +180 -0
- data/lib/mongoid/copyable.rb +67 -0
- data/lib/mongoid/criteria.rb +562 -0
- data/lib/mongoid/criteria/findable.rb +179 -0
- data/lib/mongoid/criteria/inspectable.rb +25 -0
- data/lib/mongoid/criteria/marshalable.rb +50 -0
- data/lib/mongoid/criteria/modifiable.rb +189 -0
- data/lib/mongoid/criteria/scopable.rb +158 -0
- data/lib/mongoid/document.rb +361 -0
- data/lib/mongoid/equality.rb +66 -0
- data/lib/mongoid/errors.rb +40 -0
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +25 -0
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +111 -0
- data/lib/mongoid/errors/eager_load.rb +22 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_field.rb +64 -0
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_includes.rb +32 -0
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_path.rb +21 -0
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +22 -0
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +32 -0
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +92 -0
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +19 -0
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_metadata.rb +21 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +21 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +19 -0
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/validations.rb +29 -0
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions.rb +35 -0
- data/lib/mongoid/extensions/array.rb +180 -0
- data/lib/mongoid/extensions/big_decimal.rb +69 -0
- data/lib/mongoid/extensions/boolean.rb +21 -0
- data/lib/mongoid/extensions/date.rb +77 -0
- data/lib/mongoid/extensions/date_time.rb +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +209 -0
- data/lib/mongoid/extensions/integer.rb +67 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +33 -0
- data/lib/mongoid/extensions/object.rb +274 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +199 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +88 -0
- data/lib/mongoid/extensions/time_with_zone.rb +56 -0
- data/lib/mongoid/extensions/true_class.rb +38 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +542 -0
- data/lib/mongoid/fields/foreign_key.rb +174 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +273 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +92 -0
- data/lib/mongoid/findable.rb +133 -0
- data/lib/mongoid/identity_map.rb +163 -0
- data/lib/mongoid/indexable.rb +147 -0
- data/lib/mongoid/indexable/specification.rb +115 -0
- data/lib/mongoid/indexable/validators/options.rb +103 -0
- data/lib/mongoid/inspectable.rb +59 -0
- data/lib/mongoid/interceptable.rb +265 -0
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchable.rb +152 -0
- data/lib/mongoid/matchable/all.rb +27 -0
- data/lib/mongoid/matchable/and.rb +30 -0
- data/lib/mongoid/matchable/default.rb +72 -0
- data/lib/mongoid/matchable/exists.rb +23 -0
- data/lib/mongoid/matchable/gt.rb +21 -0
- data/lib/mongoid/matchable/gte.rb +21 -0
- data/lib/mongoid/matchable/in.rb +24 -0
- data/lib/mongoid/matchable/lt.rb +21 -0
- data/lib/mongoid/matchable/lte.rb +21 -0
- data/lib/mongoid/matchable/ne.rb +21 -0
- data/lib/mongoid/matchable/nin.rb +21 -0
- data/lib/mongoid/matchable/or.rb +33 -0
- data/lib/mongoid/matchable/size.rb +21 -0
- data/lib/mongoid/persistable.rb +207 -0
- data/lib/mongoid/persistable/creatable.rb +189 -0
- data/lib/mongoid/persistable/deletable.rb +149 -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 +156 -0
- data/lib/mongoid/railties/database.rake +97 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +162 -0
- data/lib/mongoid/relations/accessors.rb +299 -0
- data/lib/mongoid/relations/auto_save.rb +106 -0
- data/lib/mongoid/relations/binding.rb +218 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +63 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +50 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +55 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +65 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +42 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +67 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +44 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +104 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +36 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +174 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +126 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +40 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +44 -0
- data/lib/mongoid/relations/cascading/destroy.rb +43 -0
- data/lib/mongoid/relations/cascading/nullify.rb +35 -0
- data/lib/mongoid/relations/cascading/restrict.rb +39 -0
- data/lib/mongoid/relations/constraint.rb +49 -0
- data/lib/mongoid/relations/conversions.rb +34 -0
- data/lib/mongoid/relations/counter_cache.rb +105 -0
- data/lib/mongoid/relations/cyclic.rb +107 -0
- data/lib/mongoid/relations/embedded/batchable.rb +355 -0
- data/lib/mongoid/relations/embedded/in.rb +231 -0
- data/lib/mongoid/relations/embedded/many.rb +639 -0
- data/lib/mongoid/relations/embedded/one.rb +223 -0
- data/lib/mongoid/relations/macros.rb +356 -0
- data/lib/mongoid/relations/many.rb +208 -0
- data/lib/mongoid/relations/marshalable.rb +32 -0
- data/lib/mongoid/relations/metadata.rb +1174 -0
- data/lib/mongoid/relations/nested_builder.rb +74 -0
- data/lib/mongoid/relations/one.rb +48 -0
- data/lib/mongoid/relations/options.rb +48 -0
- data/lib/mongoid/relations/polymorphic.rb +39 -0
- data/lib/mongoid/relations/proxy.rb +270 -0
- data/lib/mongoid/relations/referenced/in.rb +297 -0
- data/lib/mongoid/relations/referenced/many.rb +787 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +486 -0
- data/lib/mongoid/relations/referenced/one.rb +290 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +169 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +473 -0
- data/lib/mongoid/relations/touchable.rb +94 -0
- data/lib/mongoid/reloadable.rb +95 -0
- data/lib/mongoid/scopable.rb +379 -0
- data/lib/mongoid/selectable.rb +59 -0
- data/lib/mongoid/serializable.rb +170 -0
- data/lib/mongoid/sessions.rb +330 -0
- data/lib/mongoid/sessions/factory.rb +129 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/options.rb +141 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/shardable.rb +65 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +383 -0
- data/lib/mongoid/threaded/lifecycle.rb +164 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +30 -0
- data/lib/mongoid/timestamps/created/short.rb +19 -0
- data/lib/mongoid/timestamps/short.rb +10 -0
- data/lib/mongoid/timestamps/updated.rb +39 -0
- data/lib/mongoid/timestamps/updated/short.rb +19 -0
- data/lib/mongoid/traversable.rb +192 -0
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validatable.rb +180 -0
- data/lib/mongoid/validatable/associated.rb +48 -0
- data/lib/mongoid/validatable/format.rb +20 -0
- data/lib/mongoid/validatable/length.rb +20 -0
- data/lib/mongoid/validatable/localizable.rb +30 -0
- data/lib/mongoid/validatable/macros.rb +94 -0
- data/lib/mongoid/validatable/presence.rb +86 -0
- data/lib/mongoid/validatable/queryable.rb +30 -0
- data/lib/mongoid/validatable/uniqueness.rb +330 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +39 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +76 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +25 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +65 -0
- data/lib/rails/mongoid.rb +180 -0
- data/lib/support/ruby_version.rb +26 -0
- data/spec/app/models/account.rb +28 -0
- data/spec/app/models/acolyte.rb +17 -0
- data/spec/app/models/actor.rb +18 -0
- data/spec/app/models/actress.rb +2 -0
- data/spec/app/models/address.rb +77 -0
- data/spec/app/models/address_component.rb +5 -0
- data/spec/app/models/address_number.rb +6 -0
- data/spec/app/models/agency.rb +5 -0
- data/spec/app/models/agent.rb +12 -0
- data/spec/app/models/album.rb +14 -0
- data/spec/app/models/alert.rb +5 -0
- data/spec/app/models/animal.rb +25 -0
- data/spec/app/models/answer.rb +4 -0
- data/spec/app/models/appointment.rb +7 -0
- data/spec/app/models/article.rb +10 -0
- data/spec/app/models/artist.rb +66 -0
- data/spec/app/models/artwork.rb +4 -0
- data/spec/app/models/audio.rb +5 -0
- data/spec/app/models/augmentation.rb +11 -0
- data/spec/app/models/author.rb +4 -0
- data/spec/app/models/band.rb +26 -0
- data/spec/app/models/bar.rb +10 -0
- data/spec/app/models/basic.rb +6 -0
- data/spec/app/models/bed.rb +1 -0
- data/spec/app/models/big_palette.rb +2 -0
- data/spec/app/models/birthday.rb +13 -0
- data/spec/app/models/book.rb +13 -0
- data/spec/app/models/breed.rb +4 -0
- data/spec/app/models/browser.rb +6 -0
- data/spec/app/models/building.rb +5 -0
- data/spec/app/models/building_address.rb +5 -0
- data/spec/app/models/bus.rb +7 -0
- data/spec/app/models/business.rb +5 -0
- data/spec/app/models/callback_recorder.rb +25 -0
- data/spec/app/models/callback_test.rb +9 -0
- data/spec/app/models/canvas.rb +25 -0
- data/spec/app/models/car.rb +1 -0
- data/spec/app/models/cat.rb +8 -0
- data/spec/app/models/category.rb +8 -0
- data/spec/app/models/child.rb +4 -0
- data/spec/app/models/child_doc.rb +22 -0
- data/spec/app/models/church.rb +4 -0
- data/spec/app/models/circle.rb +3 -0
- data/spec/app/models/circuit.rb +4 -0
- data/spec/app/models/circus.rb +7 -0
- data/spec/app/models/code.rb +5 -0
- data/spec/app/models/comment.rb +16 -0
- data/spec/app/models/contractor.rb +5 -0
- data/spec/app/models/cookie.rb +6 -0
- data/spec/app/models/country_code.rb +8 -0
- data/spec/app/models/definition.rb +7 -0
- data/spec/app/models/description.rb +11 -0
- data/spec/app/models/dictionary.rb +10 -0
- data/spec/app/models/division.rb +10 -0
- data/spec/app/models/doctor.rb +12 -0
- data/spec/app/models/dog.rb +7 -0
- data/spec/app/models/dokument.rb +5 -0
- data/spec/app/models/dragon.rb +4 -0
- data/spec/app/models/driver.rb +7 -0
- data/spec/app/models/drug.rb +6 -0
- data/spec/app/models/dungeon.rb +4 -0
- data/spec/app/models/email.rb +6 -0
- data/spec/app/models/employer.rb +5 -0
- data/spec/app/models/entry.rb +6 -0
- data/spec/app/models/eraser.rb +1 -0
- data/spec/app/models/event.rb +22 -0
- data/spec/app/models/exhibition.rb +4 -0
- data/spec/app/models/exhibitor.rb +5 -0
- data/spec/app/models/eye.rb +9 -0
- data/spec/app/models/eye_bowl.rb +9 -0
- data/spec/app/models/face.rb +8 -0
- data/spec/app/models/favorite.rb +6 -0
- data/spec/app/models/filesystem.rb +5 -0
- data/spec/app/models/fire_hydrant.rb +6 -0
- data/spec/app/models/firefox.rb +4 -0
- data/spec/app/models/fish.rb +7 -0
- data/spec/app/models/folder.rb +7 -0
- data/spec/app/models/folder_item.rb +9 -0
- data/spec/app/models/fruits.rb +28 -0
- data/spec/app/models/game.rb +19 -0
- data/spec/app/models/ghost.rb +7 -0
- data/spec/app/models/home.rb +4 -0
- data/spec/app/models/house.rb +6 -0
- data/spec/app/models/html_writer.rb +3 -0
- data/spec/app/models/image.rb +22 -0
- data/spec/app/models/implant.rb +16 -0
- data/spec/app/models/item.rb +8 -0
- data/spec/app/models/jar.rb +7 -0
- data/spec/app/models/label.rb +40 -0
- data/spec/app/models/language.rb +5 -0
- data/spec/app/models/lat_lng.rb +15 -0
- data/spec/app/models/league.rb +11 -0
- data/spec/app/models/learner.rb +2 -0
- data/spec/app/models/line_item.rb +6 -0
- data/spec/app/models/location.rb +8 -0
- data/spec/app/models/login.rb +8 -0
- data/spec/app/models/manufacturer.rb +7 -0
- data/spec/app/models/meat.rb +4 -0
- data/spec/app/models/membership.rb +4 -0
- data/spec/app/models/mixed_drink.rb +4 -0
- data/spec/app/models/movie.rb +13 -0
- data/spec/app/models/my_hash.rb +2 -0
- data/spec/app/models/name.rb +23 -0
- data/spec/app/models/node.rb +5 -0
- data/spec/app/models/note.rb +12 -0
- data/spec/app/models/ordered_post.rb +6 -0
- data/spec/app/models/ordered_preference.rb +6 -0
- data/spec/app/models/oscar.rb +15 -0
- data/spec/app/models/override.rb +16 -0
- data/spec/app/models/ownable.rb +6 -0
- data/spec/app/models/owner.rb +6 -0
- data/spec/app/models/pack.rb +3 -0
- data/spec/app/models/page.rb +5 -0
- data/spec/app/models/page_question.rb +4 -0
- data/spec/app/models/palette.rb +7 -0
- data/spec/app/models/parent.rb +5 -0
- data/spec/app/models/parent_doc.rb +6 -0
- data/spec/app/models/passport.rb +5 -0
- data/spec/app/models/patient.rb +9 -0
- data/spec/app/models/pdf_writer.rb +3 -0
- data/spec/app/models/pencil.rb +1 -0
- data/spec/app/models/person.rb +205 -0
- data/spec/app/models/pet.rb +23 -0
- data/spec/app/models/pet_owner.rb +6 -0
- data/spec/app/models/phone.rb +11 -0
- data/spec/app/models/pizza.rb +7 -0
- data/spec/app/models/player.rb +35 -0
- data/spec/app/models/post.rb +44 -0
- data/spec/app/models/powerup.rb +11 -0
- data/spec/app/models/preference.rb +9 -0
- data/spec/app/models/princess.rb +8 -0
- data/spec/app/models/product.rb +15 -0
- data/spec/app/models/profile.rb +5 -0
- data/spec/app/models/pronunciation.rb +5 -0
- data/spec/app/models/purchase.rb +4 -0
- data/spec/app/models/question.rb +8 -0
- data/spec/app/models/quiz.rb +7 -0
- data/spec/app/models/rating.rb +8 -0
- data/spec/app/models/record.rb +46 -0
- data/spec/app/models/registry.rb +4 -0
- data/spec/app/models/role.rb +7 -0
- data/spec/app/models/root_category.rb +4 -0
- data/spec/app/models/sandwich.rb +4 -0
- data/spec/app/models/scheduler.rb +7 -0
- data/spec/app/models/seo.rb +7 -0
- data/spec/app/models/series.rb +4 -0
- data/spec/app/models/server.rb +13 -0
- data/spec/app/models/service.rb +22 -0
- data/spec/app/models/shape.rb +12 -0
- data/spec/app/models/shelf.rb +5 -0
- data/spec/app/models/shipping_container.rb +5 -0
- data/spec/app/models/shipping_pack.rb +3 -0
- data/spec/app/models/shop.rb +6 -0
- data/spec/app/models/short_agent.rb +4 -0
- data/spec/app/models/short_quiz.rb +5 -0
- data/spec/app/models/slave.rb +6 -0
- data/spec/app/models/song.rb +8 -0
- data/spec/app/models/sound.rb +5 -0
- data/spec/app/models/square.rb +4 -0
- data/spec/app/models/strategy.rb +3 -0
- data/spec/app/models/sub_item.rb +3 -0
- data/spec/app/models/subscription.rb +4 -0
- data/spec/app/models/survey.rb +5 -0
- data/spec/app/models/symptom.rb +6 -0
- data/spec/app/models/tag.rb +8 -0
- data/spec/app/models/target.rb +5 -0
- data/spec/app/models/template.rb +5 -0
- data/spec/app/models/thing.rb +9 -0
- data/spec/app/models/title.rb +3 -0
- data/spec/app/models/tool.rb +8 -0
- data/spec/app/models/topping.rb +5 -0
- data/spec/app/models/track.rb +38 -0
- data/spec/app/models/translation.rb +5 -0
- data/spec/app/models/tree.rb +9 -0
- data/spec/app/models/truck.rb +3 -0
- data/spec/app/models/user.rb +21 -0
- data/spec/app/models/user_account.rb +10 -0
- data/spec/app/models/validation_callback.rb +10 -0
- data/spec/app/models/vehicle.rb +11 -0
- data/spec/app/models/version.rb +5 -0
- data/spec/app/models/vet_visit.rb +5 -0
- data/spec/app/models/video.rb +13 -0
- data/spec/app/models/weapon.rb +11 -0
- data/spec/app/models/wiki_page.rb +14 -0
- data/spec/app/models/word.rb +15 -0
- data/spec/app/models/word_origin.rb +11 -0
- data/spec/app/models/writer.rb +11 -0
- data/spec/config/mongoid.yml +38 -0
- data/spec/mongoid/atomic/modifiers_spec.rb +456 -0
- data/spec/mongoid/atomic/paths/embedded/many_spec.rb +118 -0
- data/spec/mongoid/atomic/paths/embedded/one_spec.rb +110 -0
- data/spec/mongoid/atomic/paths/root_spec.rb +48 -0
- data/spec/mongoid/atomic/paths_spec.rb +270 -0
- data/spec/mongoid/atomic_spec.rb +365 -0
- data/spec/mongoid/attributes/nested_spec.rb +4832 -0
- data/spec/mongoid/attributes/readonly_spec.rb +169 -0
- data/spec/mongoid/attributes_spec.rb +1412 -0
- data/spec/mongoid/changeable_spec.rb +1507 -0
- data/spec/mongoid/composable_spec.rb +24 -0
- data/spec/mongoid/config/environment_spec.rb +83 -0
- data/spec/mongoid/config/options_spec.rb +56 -0
- data/spec/mongoid/config_spec.rb +318 -0
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +293 -0
- data/spec/mongoid/contextual/aggregable/mongo_spec.rb +455 -0
- data/spec/mongoid/contextual/atomic_spec.rb +529 -0
- data/spec/mongoid/contextual/find_and_modify_spec.rb +220 -0
- data/spec/mongoid/contextual/geo_near_spec.rb +405 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +464 -0
- data/spec/mongoid/contextual/memory_spec.rb +1236 -0
- data/spec/mongoid/contextual/mongo_spec.rb +1843 -0
- data/spec/mongoid/contextual/text_search_spec.rb +207 -0
- data/spec/mongoid/copyable_spec.rb +393 -0
- data/spec/mongoid/criteria/findable_spec.rb +1189 -0
- data/spec/mongoid/criteria/inspectable_spec.rb +27 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +28 -0
- data/spec/mongoid/criteria/modifiable_spec.rb +1063 -0
- data/spec/mongoid/criteria/scopable_spec.rb +391 -0
- data/spec/mongoid/criteria_spec.rb +3821 -0
- data/spec/mongoid/document_spec.rb +1205 -0
- data/spec/mongoid/equality_spec.rb +241 -0
- data/spec/mongoid/errors/ambiguous_relationship_spec.rb +29 -0
- data/spec/mongoid/errors/callback_spec.rb +29 -0
- data/spec/mongoid/errors/delete_restriction_spec.rb +29 -0
- data/spec/mongoid/errors/document_not_found_spec.rb +104 -0
- data/spec/mongoid/errors/eager_load_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_collection_spec.rb +36 -0
- data/spec/mongoid/errors/invalid_config_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_option_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_field_spec.rb +37 -0
- data/spec/mongoid/errors/invalid_find_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_includes_spec.rb +40 -0
- data/spec/mongoid/errors/invalid_index_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_path_spec.rb +23 -0
- data/spec/mongoid/errors/invalid_scope_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_set_polymorphic_relation_spec.rb +17 -0
- data/spec/mongoid/errors/invalid_storage_options_spec.rb +29 -0
- data/spec/mongoid/errors/invalid_time_spec.rb +29 -0
- data/spec/mongoid/errors/inverse_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_relations_spec.rb +29 -0
- data/spec/mongoid/errors/mixed_session_configuration_spec.rb +29 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +48 -0
- data/spec/mongoid/errors/nested_attributes_metadata_not_found_spec.rb +29 -0
- data/spec/mongoid/errors/no_environment_spec.rb +29 -0
- data/spec/mongoid/errors/no_map_reduce_output_spec.rb +29 -0
- data/spec/mongoid/errors/no_metadata_spec.rb +23 -0
- data/spec/mongoid/errors/no_parent_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_config_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_database_spec.rb +29 -0
- data/spec/mongoid/errors/no_session_hosts_spec.rb +29 -0
- data/spec/mongoid/errors/no_sessions_config_spec.rb +29 -0
- data/spec/mongoid/errors/readonly_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/scope_overwrite_spec.rb +29 -0
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +29 -0
- data/spec/mongoid/errors/unknown_attribute_spec.rb +29 -0
- data/spec/mongoid/errors/unsaved_document_spec.rb +37 -0
- data/spec/mongoid/errors/unsupported_javascript_spec.rb +29 -0
- data/spec/mongoid/errors/validations_spec.rb +45 -0
- data/spec/mongoid/extensions/array_spec.rb +638 -0
- data/spec/mongoid/extensions/big_decimal_spec.rb +104 -0
- data/spec/mongoid/extensions/binary_spec.rb +60 -0
- data/spec/mongoid/extensions/boolean_spec.rb +135 -0
- data/spec/mongoid/extensions/date_spec.rb +235 -0
- data/spec/mongoid/extensions/date_time_spec.rb +155 -0
- data/spec/mongoid/extensions/false_class_spec.rb +42 -0
- data/spec/mongoid/extensions/float_spec.rb +133 -0
- data/spec/mongoid/extensions/hash_spec.rb +333 -0
- data/spec/mongoid/extensions/integer_spec.rb +136 -0
- data/spec/mongoid/extensions/module_spec.rb +42 -0
- data/spec/mongoid/extensions/nil_class_spec.rb +11 -0
- data/spec/mongoid/extensions/object_id_spec.rb +946 -0
- data/spec/mongoid/extensions/object_spec.rb +292 -0
- data/spec/mongoid/extensions/range_spec.rb +105 -0
- data/spec/mongoid/extensions/regexp_spec.rb +47 -0
- data/spec/mongoid/extensions/set_spec.rb +33 -0
- data/spec/mongoid/extensions/string_spec.rb +357 -0
- data/spec/mongoid/extensions/symbol_spec.rb +76 -0
- data/spec/mongoid/extensions/time_spec.rb +467 -0
- data/spec/mongoid/extensions/time_with_zone_spec.rb +405 -0
- data/spec/mongoid/extensions/true_class_spec.rb +42 -0
- data/spec/mongoid/extensions_spec.rb +15 -0
- data/spec/mongoid/factory_spec.rb +185 -0
- data/spec/mongoid/fields/foreign_key_spec.rb +694 -0
- data/spec/mongoid/fields/internal/foreign_keys/array_spec.rb +184 -0
- data/spec/mongoid/fields/internal/foreign_keys/object_spec.rb +201 -0
- data/spec/mongoid/fields/localized_spec.rb +386 -0
- data/spec/mongoid/fields/standard_spec.rb +166 -0
- data/spec/mongoid/fields_spec.rb +1229 -0
- data/spec/mongoid/findable_spec.rb +342 -0
- data/spec/mongoid/identity_map_spec.rb +564 -0
- data/spec/mongoid/indexable/specification_spec.rb +87 -0
- data/spec/mongoid/indexable_spec.rb +504 -0
- data/spec/mongoid/inspectable_spec.rb +49 -0
- data/spec/mongoid/interceptable_spec.rb +1564 -0
- data/spec/mongoid/loggable_spec.rb +21 -0
- data/spec/mongoid/matchable/all_spec.rb +31 -0
- data/spec/mongoid/matchable/and_spec.rb +162 -0
- data/spec/mongoid/matchable/default_spec.rb +130 -0
- data/spec/mongoid/matchable/exists_spec.rb +57 -0
- data/spec/mongoid/matchable/gt_spec.rb +75 -0
- data/spec/mongoid/matchable/gte_spec.rb +74 -0
- data/spec/mongoid/matchable/in_spec.rb +25 -0
- data/spec/mongoid/matchable/lt_spec.rb +74 -0
- data/spec/mongoid/matchable/lte_spec.rb +74 -0
- data/spec/mongoid/matchable/ne_spec.rb +25 -0
- data/spec/mongoid/matchable/nin_spec.rb +25 -0
- data/spec/mongoid/matchable/or_spec.rb +106 -0
- data/spec/mongoid/matchable/size_spec.rb +25 -0
- data/spec/mongoid/matchable_spec.rb +532 -0
- 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 +522 -0
- data/spec/mongoid/persistable/upsertable_spec.rb +106 -0
- data/spec/mongoid/persistable_spec.rb +206 -0
- data/spec/mongoid/positional_spec.rb +227 -0
- data/spec/mongoid/railties/document_spec.rb +24 -0
- data/spec/mongoid/relations/accessors_spec.rb +736 -0
- data/spec/mongoid/relations/auto_save_spec.rb +261 -0
- data/spec/mongoid/relations/bindings/embedded/in_spec.rb +171 -0
- data/spec/mongoid/relations/bindings/embedded/many_spec.rb +54 -0
- data/spec/mongoid/relations/bindings/embedded/one_spec.rb +77 -0
- data/spec/mongoid/relations/bindings/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/bindings/referenced/many_spec.rb +153 -0
- data/spec/mongoid/relations/bindings/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/bindings/referenced/one_spec.rb +131 -0
- data/spec/mongoid/relations/builders/embedded/in_spec.rb +34 -0
- data/spec/mongoid/relations/builders/embedded/many_spec.rb +132 -0
- data/spec/mongoid/relations/builders/embedded/one_spec.rb +99 -0
- data/spec/mongoid/relations/builders/nested_attributes/many_spec.rb +234 -0
- data/spec/mongoid/relations/builders/nested_attributes/one_spec.rb +250 -0
- data/spec/mongoid/relations/builders/referenced/in_spec.rb +241 -0
- data/spec/mongoid/relations/builders/referenced/many_spec.rb +137 -0
- data/spec/mongoid/relations/builders/referenced/many_to_many_spec.rb +178 -0
- data/spec/mongoid/relations/builders/referenced/one_spec.rb +124 -0
- data/spec/mongoid/relations/builders_spec.rb +226 -0
- data/spec/mongoid/relations/cascading/delete_spec.rb +101 -0
- data/spec/mongoid/relations/cascading/destroy_spec.rb +47 -0
- data/spec/mongoid/relations/cascading/nullify_spec.rb +32 -0
- data/spec/mongoid/relations/cascading/restrict_spec.rb +68 -0
- data/spec/mongoid/relations/cascading_spec.rb +355 -0
- data/spec/mongoid/relations/constraint_spec.rb +74 -0
- data/spec/mongoid/relations/conversions_spec.rb +126 -0
- data/spec/mongoid/relations/counter_cache_spec.rb +205 -0
- data/spec/mongoid/relations/cyclic_spec.rb +156 -0
- data/spec/mongoid/relations/embedded/dirty_spec.rb +65 -0
- data/spec/mongoid/relations/embedded/in_spec.rb +579 -0
- data/spec/mongoid/relations/embedded/many_spec.rb +3781 -0
- data/spec/mongoid/relations/embedded/one_spec.rb +1014 -0
- data/spec/mongoid/relations/macros_spec.rb +613 -0
- data/spec/mongoid/relations/metadata_spec.rb +1917 -0
- data/spec/mongoid/relations/options_spec.rb +35 -0
- data/spec/mongoid/relations/polymorphic_spec.rb +128 -0
- data/spec/mongoid/relations/proxy_spec.rb +48 -0
- data/spec/mongoid/relations/referenced/in_spec.rb +1435 -0
- data/spec/mongoid/relations/referenced/many_spec.rb +3546 -0
- data/spec/mongoid/relations/referenced/many_to_many_spec.rb +3556 -0
- data/spec/mongoid/relations/referenced/one_spec.rb +1289 -0
- data/spec/mongoid/relations/reflections_spec.rb +101 -0
- data/spec/mongoid/relations/synchronization_spec.rb +449 -0
- data/spec/mongoid/relations/targets/enumerable_spec.rb +1710 -0
- data/spec/mongoid/relations/touchable_spec.rb +296 -0
- data/spec/mongoid/relations_spec.rb +188 -0
- data/spec/mongoid/reloadable_spec.rb +305 -0
- data/spec/mongoid/scopable_spec.rb +926 -0
- data/spec/mongoid/selectable_spec.rb +134 -0
- data/spec/mongoid/serializable_spec.rb +862 -0
- data/spec/mongoid/sessions/factory_spec.rb +312 -0
- data/spec/mongoid/sessions/mongo_uri_spec.rb +103 -0
- data/spec/mongoid/sessions/options_spec.rb +71 -0
- data/spec/mongoid/sessions_spec.rb +1078 -0
- data/spec/mongoid/shardable_spec.rb +61 -0
- data/spec/mongoid/state_spec.rb +102 -0
- data/spec/mongoid/threaded_spec.rb +258 -0
- data/spec/mongoid/timestamps/created/short_spec.rb +51 -0
- data/spec/mongoid/timestamps/created_spec.rb +44 -0
- data/spec/mongoid/timestamps/updated/short_spec.rb +90 -0
- data/spec/mongoid/timestamps/updated_spec.rb +86 -0
- data/spec/mongoid/timestamps_spec.rb +112 -0
- data/spec/mongoid/traversable_spec.rb +244 -0
- data/spec/mongoid/unit_of_work_spec.rb +196 -0
- data/spec/mongoid/validatable/associated_spec.rb +183 -0
- data/spec/mongoid/validatable/format_spec.rb +83 -0
- data/spec/mongoid/validatable/length_spec.rb +119 -0
- data/spec/mongoid/validatable/numericality_spec.rb +30 -0
- data/spec/mongoid/validatable/presence_spec.rb +511 -0
- data/spec/mongoid/validatable/uniqueness_spec.rb +2305 -0
- data/spec/mongoid/validatable_spec.rb +309 -0
- data/spec/mongoid_spec.rb +74 -0
- data/spec/rack/mongoid/middleware/identity_map_spec.rb +72 -0
- data/spec/rails/mongoid_spec.rb +462 -0
- data/spec/spec_helper.rb +103 -0
- metadata +1159 -0
@@ -0,0 +1,355 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Embedded
|
5
|
+
|
6
|
+
# Contains behaviour for executing operations in batch on embedded
|
7
|
+
# documents.
|
8
|
+
module Batchable
|
9
|
+
include Positional
|
10
|
+
|
11
|
+
# Insert new documents as a batch push ($pushAll). This ensures that
|
12
|
+
# all callbacks are run at the appropriate time and only 1 request is
|
13
|
+
# made to the database.
|
14
|
+
#
|
15
|
+
# @example Execute the batch push.
|
16
|
+
# batchable.batch_insert([ doc_one, doc_two ])
|
17
|
+
#
|
18
|
+
# @param [ Array<Document> ] docs The docs to add.
|
19
|
+
#
|
20
|
+
# @return [ Array<Hash> ] The inserts.
|
21
|
+
#
|
22
|
+
# @since 3.0.0
|
23
|
+
def batch_insert(docs)
|
24
|
+
execute_batch_insert(docs, "$pushAll")
|
25
|
+
end
|
26
|
+
|
27
|
+
# Clear all of the docs out of the relation in a single swipe.
|
28
|
+
#
|
29
|
+
# @example Clear all docs.
|
30
|
+
# batchable.batch_clear(docs)
|
31
|
+
#
|
32
|
+
# @param [ Array<Document> ] docs The docs to clear.
|
33
|
+
#
|
34
|
+
# @return [ Array ] The empty array.
|
35
|
+
#
|
36
|
+
# @since 3.0.0
|
37
|
+
def batch_clear(docs)
|
38
|
+
pre_process_batch_remove(docs, :delete)
|
39
|
+
unless docs.empty?
|
40
|
+
collection.find(selector).update(
|
41
|
+
positionally(selector, "$unset" => { path => true })
|
42
|
+
)
|
43
|
+
post_process_batch_remove(docs, :delete)
|
44
|
+
end
|
45
|
+
_unscoped.clear
|
46
|
+
end
|
47
|
+
|
48
|
+
# Batch remove the provided documents as a $pullAll.
|
49
|
+
#
|
50
|
+
# @example Batch remove the documents.
|
51
|
+
# batchable.batch_remove([ doc_one, doc_two ])
|
52
|
+
#
|
53
|
+
# @param [ Array<Document> ] docs The docs to remove.
|
54
|
+
# @param [ Symbol ] method Delete or destroy.
|
55
|
+
#
|
56
|
+
# @since 3.0.0
|
57
|
+
def batch_remove(docs, method = :delete)
|
58
|
+
removals = pre_process_batch_remove(docs, method)
|
59
|
+
if !docs.empty?
|
60
|
+
collection.find(selector).update(
|
61
|
+
positionally(selector, "$pullAll" => { path => removals })
|
62
|
+
)
|
63
|
+
post_process_batch_remove(docs, method)
|
64
|
+
end
|
65
|
+
reindex
|
66
|
+
end
|
67
|
+
|
68
|
+
# Batch replace the provided documents as a $set.
|
69
|
+
#
|
70
|
+
# @example Batch replace the documents.
|
71
|
+
# batchable.batch_replace([ doc_one, doc_two ])
|
72
|
+
#
|
73
|
+
# @param [ Array<Document> ] docs The docs to replace with.
|
74
|
+
#
|
75
|
+
# @return [ Array<Hash> ] The inserts.
|
76
|
+
#
|
77
|
+
# @since 3.0.0
|
78
|
+
def batch_replace(docs)
|
79
|
+
if docs.blank?
|
80
|
+
if _assigning? && !empty?
|
81
|
+
base.add_atomic_unset(first)
|
82
|
+
end
|
83
|
+
batch_remove(target.dup)
|
84
|
+
else
|
85
|
+
base.delayed_atomic_sets.clear unless _assigning?
|
86
|
+
docs = normalize_docs(docs).compact
|
87
|
+
target.clear and _unscoped.clear
|
88
|
+
inserts = execute_batch_insert(docs, "$set")
|
89
|
+
add_atomic_sets(inserts)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
# Add the atomic sets to the base document.
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
#
|
99
|
+
# @example Add the atomic sets.
|
100
|
+
# batchable.add_atomic_sets([{ field: value }])
|
101
|
+
#
|
102
|
+
# @param [ Array<Hash> ] sets The atomic sets.
|
103
|
+
#
|
104
|
+
# @since 3.0.0
|
105
|
+
def add_atomic_sets(sets)
|
106
|
+
if _assigning?
|
107
|
+
base.delayed_atomic_sets[path].try(:clear)
|
108
|
+
base.collect_children.each do |child|
|
109
|
+
child.delayed_atomic_sets.clear
|
110
|
+
end
|
111
|
+
base.delayed_atomic_sets[path] = sets
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# Perform a batch persist of the provided documents with the supplied
|
116
|
+
# operation.
|
117
|
+
#
|
118
|
+
# @api private
|
119
|
+
#
|
120
|
+
# @example Perform a batch operation.
|
121
|
+
# batchable.execute_batch(docs, "$set")
|
122
|
+
#
|
123
|
+
# @param [ Array<Document> ] docs The docs to persist.
|
124
|
+
# @param [ String ] operation The atomic operation.
|
125
|
+
#
|
126
|
+
# @return [ Array<Hash> ] The inserts.
|
127
|
+
#
|
128
|
+
# @since 3.0.0
|
129
|
+
def execute_batch_insert(docs, operation)
|
130
|
+
self.inserts_valid = true
|
131
|
+
inserts = pre_process_batch_insert(docs)
|
132
|
+
if insertable?
|
133
|
+
collection.find(selector).update(
|
134
|
+
positionally(selector, operation => { path => inserts })
|
135
|
+
)
|
136
|
+
post_process_batch_insert(docs)
|
137
|
+
end
|
138
|
+
inserts
|
139
|
+
end
|
140
|
+
|
141
|
+
# Are we in a state to be able to batch insert?
|
142
|
+
#
|
143
|
+
# @api private
|
144
|
+
#
|
145
|
+
# @example Can inserts be performed?
|
146
|
+
# batchable.insertable?
|
147
|
+
#
|
148
|
+
# @return [ true, false ] If inserts can be performed.
|
149
|
+
#
|
150
|
+
# @since 3.0.0
|
151
|
+
def insertable?
|
152
|
+
persistable? && !_assigning? && inserts_valid
|
153
|
+
end
|
154
|
+
|
155
|
+
# Are the inserts currently valid?
|
156
|
+
#
|
157
|
+
# @api private
|
158
|
+
#
|
159
|
+
# @example Are the inserts currently valid.
|
160
|
+
# batchable.inserts_valid
|
161
|
+
#
|
162
|
+
# @return [ true, false ] If inserts are currently valid.
|
163
|
+
#
|
164
|
+
# @since 3.0.0
|
165
|
+
def inserts_valid
|
166
|
+
@inserts_valid
|
167
|
+
end
|
168
|
+
|
169
|
+
# Set the inserts valid flag.
|
170
|
+
#
|
171
|
+
# @api private
|
172
|
+
#
|
173
|
+
# @example Set the flag.
|
174
|
+
# batchable.inserts_valid = true
|
175
|
+
#
|
176
|
+
# @param [ true, false ] value The flag.
|
177
|
+
#
|
178
|
+
# @return [ true, false ] The flag.
|
179
|
+
#
|
180
|
+
# @since 3.0.0
|
181
|
+
def inserts_valid=(value)
|
182
|
+
@inserts_valid = value
|
183
|
+
end
|
184
|
+
|
185
|
+
# Normalize the documents, in case they were provided as an array of
|
186
|
+
# hashes.
|
187
|
+
#
|
188
|
+
# @api private
|
189
|
+
#
|
190
|
+
# @example Normalize the docs.
|
191
|
+
# batchable.normalize_docs(docs)
|
192
|
+
#
|
193
|
+
# @param [ Array<Hash, Document> ] docs The docs to normalize.
|
194
|
+
#
|
195
|
+
# @return [ Array<Document> ] The docs.
|
196
|
+
#
|
197
|
+
# @since 3.0.0
|
198
|
+
def normalize_docs(docs)
|
199
|
+
if docs.first.is_a?(::Hash)
|
200
|
+
docs.map do |doc|
|
201
|
+
attributes = { metadata: metadata, _parent: base }
|
202
|
+
attributes.merge!(doc)
|
203
|
+
Factory.build(klass, attributes)
|
204
|
+
end
|
205
|
+
else
|
206
|
+
docs
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
# Get the atomic path.
|
211
|
+
#
|
212
|
+
# @api private
|
213
|
+
#
|
214
|
+
# @example Get the atomic path.
|
215
|
+
# batchable.path
|
216
|
+
#
|
217
|
+
# @return [ String ] The atomic path.
|
218
|
+
#
|
219
|
+
# @since 3.0.0
|
220
|
+
def path
|
221
|
+
@path ||= _unscoped.first.atomic_path
|
222
|
+
end
|
223
|
+
|
224
|
+
# Set the atomic path.
|
225
|
+
#
|
226
|
+
# @api private
|
227
|
+
#
|
228
|
+
# @example Set the atomic path.
|
229
|
+
# batchable.path = "addresses"
|
230
|
+
#
|
231
|
+
# @param [ String ] value The path.
|
232
|
+
#
|
233
|
+
# @return [ String ] The path.
|
234
|
+
#
|
235
|
+
# @since 3.0.0
|
236
|
+
def path=(value)
|
237
|
+
@path = value
|
238
|
+
end
|
239
|
+
|
240
|
+
# Get the selector for executing atomic operations on the collection.
|
241
|
+
#
|
242
|
+
# @api private
|
243
|
+
#
|
244
|
+
# @example Get the selector.
|
245
|
+
# batchable.selector
|
246
|
+
#
|
247
|
+
# @return [ Hash ] The atomic selector.
|
248
|
+
#
|
249
|
+
# @since 3.0.0
|
250
|
+
def selector
|
251
|
+
@selector ||= base.atomic_selector
|
252
|
+
end
|
253
|
+
|
254
|
+
# Pre processes the batch insert for the provided documents.
|
255
|
+
#
|
256
|
+
# @api private
|
257
|
+
#
|
258
|
+
# @example Pre process the documents.
|
259
|
+
# batchable.pre_process_batch_insert(docs)
|
260
|
+
#
|
261
|
+
# @param [ Array<Document> ] docs The documents.
|
262
|
+
#
|
263
|
+
# @return [ Array<Hash> ] The documents as an array of hashes.
|
264
|
+
#
|
265
|
+
# @since 3.0.0
|
266
|
+
def pre_process_batch_insert(docs)
|
267
|
+
docs.map do |doc|
|
268
|
+
next unless doc
|
269
|
+
append(doc)
|
270
|
+
if persistable? && !_assigning?
|
271
|
+
self.path = doc.atomic_path unless path
|
272
|
+
if doc.valid?(:create)
|
273
|
+
doc.run_before_callbacks(:save, :create)
|
274
|
+
else
|
275
|
+
self.inserts_valid = false
|
276
|
+
end
|
277
|
+
end
|
278
|
+
doc.as_document
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
# Pre process the batch removal.
|
283
|
+
#
|
284
|
+
# @api private
|
285
|
+
#
|
286
|
+
# @example Pre process the documents.
|
287
|
+
# batchable.pre_process_batch_remove(docs, :delete)
|
288
|
+
#
|
289
|
+
# @param [ Array<Document> ] docs The documents.
|
290
|
+
# @param [ Symbol ] method Delete or destroy.
|
291
|
+
#
|
292
|
+
# @return [ Array<Hash> ] The documents as hashes.
|
293
|
+
#
|
294
|
+
# @since 3.0.0
|
295
|
+
def pre_process_batch_remove(docs, method)
|
296
|
+
docs.map do |doc|
|
297
|
+
self.path = doc.atomic_path unless path
|
298
|
+
execute_callback :before_remove, doc
|
299
|
+
unless _assigning?
|
300
|
+
doc.cascade!
|
301
|
+
doc.run_before_callbacks(:destroy) if method == :destroy
|
302
|
+
end
|
303
|
+
target.delete_one(doc)
|
304
|
+
_unscoped.delete_one(doc)
|
305
|
+
unbind_one(doc)
|
306
|
+
execute_callback :after_remove, doc
|
307
|
+
doc.as_document
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
# Post process the documents after batch insert.
|
312
|
+
#
|
313
|
+
# @api private
|
314
|
+
#
|
315
|
+
# @example Post process the documents.
|
316
|
+
# batchable.post_process_batch_insert(docs)
|
317
|
+
#
|
318
|
+
# @param [ Array<Documents> ] docs The inserted docs.
|
319
|
+
#
|
320
|
+
# @return [ Enumerable ] The document enum.
|
321
|
+
#
|
322
|
+
# @since 3.0.0
|
323
|
+
def post_process_batch_insert(docs)
|
324
|
+
docs.each do |doc|
|
325
|
+
doc.new_record = false
|
326
|
+
doc.run_after_callbacks(:create, :save)
|
327
|
+
doc.post_persist
|
328
|
+
end
|
329
|
+
end
|
330
|
+
|
331
|
+
# Post process the batch removal.
|
332
|
+
#
|
333
|
+
# @api private
|
334
|
+
#
|
335
|
+
# @example Post process the documents.
|
336
|
+
# batchable.post_process_batch_remove(docs, :delete)
|
337
|
+
#
|
338
|
+
# @param [ Array<Document> ] docs The documents.
|
339
|
+
# @param [ Symbol ] method Delete or destroy.
|
340
|
+
#
|
341
|
+
# @return [ Array<Document> ] The documents.
|
342
|
+
#
|
343
|
+
# @since 3.0.0
|
344
|
+
def post_process_batch_remove(docs, method)
|
345
|
+
docs.each do |doc|
|
346
|
+
doc.run_after_callbacks(:destroy) if method == :destroy
|
347
|
+
doc.freeze
|
348
|
+
doc.destroyed = true
|
349
|
+
IdentityMap.remove(doc)
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
@@ -0,0 +1,231 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Embedded
|
5
|
+
|
6
|
+
# This class defines the behaviour necessary to handle relations that are
|
7
|
+
# embedded within another relation, either as a single document or
|
8
|
+
# multiple documents.
|
9
|
+
class In < Relations::One
|
10
|
+
|
11
|
+
# Instantiate a new embedded_in relation.
|
12
|
+
#
|
13
|
+
# @example Create the new relation.
|
14
|
+
# Embedded::In.new(name, person, metadata)
|
15
|
+
#
|
16
|
+
# @param [ Document ] base The document the relation hangs off of.
|
17
|
+
# @param [ Document ] target The target (parent) of the relation.
|
18
|
+
# @param [ Metadata ] metadata The relation metadata.
|
19
|
+
#
|
20
|
+
# @return [ In ] The proxy.
|
21
|
+
def initialize(base, target, metadata)
|
22
|
+
init(base, target, metadata) do
|
23
|
+
characterize_one(target)
|
24
|
+
bind_one
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Substitutes the supplied target documents for the existing document
|
29
|
+
# in the relation.
|
30
|
+
#
|
31
|
+
# @example Substitute the new document.
|
32
|
+
# person.name.substitute(new_name)
|
33
|
+
#
|
34
|
+
# @param [ Document ] other A document to replace the target.
|
35
|
+
#
|
36
|
+
# @return [ Document, nil ] The relation or nil.
|
37
|
+
#
|
38
|
+
# @since 2.0.0.rc.1
|
39
|
+
def substitute(replacement)
|
40
|
+
unbind_one
|
41
|
+
unless replacement
|
42
|
+
base.delete if persistable?
|
43
|
+
return nil
|
44
|
+
end
|
45
|
+
base.new_record = true
|
46
|
+
self.target = replacement
|
47
|
+
bind_one
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# Instantiate the binding associated with this relation.
|
54
|
+
#
|
55
|
+
# @example Get the binding.
|
56
|
+
# binding([ address ])
|
57
|
+
#
|
58
|
+
# @param [ Proxy ] new_target The new documents to bind with.
|
59
|
+
#
|
60
|
+
# @return [ Binding ] A binding object.
|
61
|
+
#
|
62
|
+
# @since 2.0.0.rc.1
|
63
|
+
def binding
|
64
|
+
Bindings::Embedded::In.new(base, target, metadata)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Characterize the document.
|
68
|
+
#
|
69
|
+
# @example Set the base metadata.
|
70
|
+
# relation.characterize_one(document)
|
71
|
+
#
|
72
|
+
# @param [ Document ] document The document to set the metadata on.
|
73
|
+
#
|
74
|
+
# @since 2.1.0
|
75
|
+
def characterize_one(document)
|
76
|
+
unless base.metadata
|
77
|
+
base.metadata = metadata.inverse_metadata(document)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Are we able to persist this relation?
|
82
|
+
#
|
83
|
+
# @example Can we persist the relation?
|
84
|
+
# relation.persistable?
|
85
|
+
#
|
86
|
+
# @return [ true, false ] If the relation is persistable.
|
87
|
+
#
|
88
|
+
# @since 2.1.0
|
89
|
+
def persistable?
|
90
|
+
target.persisted? && !_binding? && !_building?
|
91
|
+
end
|
92
|
+
|
93
|
+
class << self
|
94
|
+
|
95
|
+
# Return the builder that is responsible for generating the documents
|
96
|
+
# that will be used by this relation.
|
97
|
+
#
|
98
|
+
# @example Get the builder.
|
99
|
+
# Embedded::In.builder(meta, object, person)
|
100
|
+
#
|
101
|
+
# @param [ Document ] base The base document.
|
102
|
+
# @param [ Metadata ] meta The metadata of the relation.
|
103
|
+
# @param [ Document, Hash ] object A document or attributes to build with.
|
104
|
+
#
|
105
|
+
# @return [ Builder ] A newly instantiated builder object.
|
106
|
+
#
|
107
|
+
# @since 2.0.0.rc.1
|
108
|
+
def builder(base, meta, object)
|
109
|
+
Builders::Embedded::In.new(base, meta, object)
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns true if the relation is an embedded one. In this case
|
113
|
+
# always true.
|
114
|
+
#
|
115
|
+
# @example Is this relation embedded?
|
116
|
+
# Embedded::In.embedded?
|
117
|
+
#
|
118
|
+
# @return [ true ] true.
|
119
|
+
#
|
120
|
+
# @since 2.0.0.rc.1
|
121
|
+
def embedded?
|
122
|
+
true
|
123
|
+
end
|
124
|
+
|
125
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
126
|
+
#
|
127
|
+
# @example Get the suffix for the foreign key.
|
128
|
+
# Referenced::Many.foreign_key_suffix
|
129
|
+
#
|
130
|
+
# @return [ nil ] nil.
|
131
|
+
#
|
132
|
+
# @since 3.0.0
|
133
|
+
def foreign_key_suffix
|
134
|
+
nil
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns the macro for this relation. Used mostly as a helper in
|
138
|
+
# reflection.
|
139
|
+
#
|
140
|
+
# @example Get the macro.
|
141
|
+
# Mongoid::Relations::Embedded::In.macro
|
142
|
+
#
|
143
|
+
# @return [ Symbol ] :embedded_in.
|
144
|
+
#
|
145
|
+
# @since 2.0.0.rc.1
|
146
|
+
def macro
|
147
|
+
:embedded_in
|
148
|
+
end
|
149
|
+
|
150
|
+
# Return the nested builder that is responsible for generating
|
151
|
+
# the documents that will be used by this relation.
|
152
|
+
#
|
153
|
+
# @example Get the builder.
|
154
|
+
# NestedAttributes::One.builder(attributes, options)
|
155
|
+
#
|
156
|
+
# @param [ Metadata ] metadata The relation metadata.
|
157
|
+
# @param [ Hash ] attributes The attributes to build with.
|
158
|
+
# @param [ Hash ] options The options for the builder.
|
159
|
+
#
|
160
|
+
# @option options [ true, false ] :allow_destroy Can documents be
|
161
|
+
# deleted?
|
162
|
+
# @option options [ Integer ] :limit Max number of documents to
|
163
|
+
# create at once.
|
164
|
+
# @option options [ Proc, Symbol ] :reject_if If documents match this
|
165
|
+
# option then they are ignored.
|
166
|
+
# @option options [ true, false ] :update_only Only existing documents
|
167
|
+
# can be modified.
|
168
|
+
#
|
169
|
+
# @return [ Builder ] A newly instantiated nested builder object.
|
170
|
+
#
|
171
|
+
# @since 2.0.0.rc.1
|
172
|
+
def nested_builder(metadata, attributes, options)
|
173
|
+
Builders::NestedAttributes::One.new(metadata, attributes, options)
|
174
|
+
end
|
175
|
+
|
176
|
+
# Get the path calculator for the supplied document.
|
177
|
+
#
|
178
|
+
# @example Get the path calculator.
|
179
|
+
# Proxy.path(document)
|
180
|
+
#
|
181
|
+
# @param [ Document ] document The document to calculate on.
|
182
|
+
#
|
183
|
+
# @return [ Root ] The root atomic path calculator.
|
184
|
+
#
|
185
|
+
# @since 2.1.0
|
186
|
+
def path(document)
|
187
|
+
Mongoid::Atomic::Paths::Root.new(document)
|
188
|
+
end
|
189
|
+
|
190
|
+
# Tells the caller if this relation is one that stores the foreign
|
191
|
+
# key on its own objects.
|
192
|
+
#
|
193
|
+
# @example Does this relation store a foreign key?
|
194
|
+
# Embedded::In.stores_foreign_key?
|
195
|
+
#
|
196
|
+
# @return [ false ] false.
|
197
|
+
#
|
198
|
+
# @since 2.0.0.rc.1
|
199
|
+
def stores_foreign_key?
|
200
|
+
false
|
201
|
+
end
|
202
|
+
|
203
|
+
# Get the valid options allowed with this relation.
|
204
|
+
#
|
205
|
+
# @example Get the valid options.
|
206
|
+
# Relation.valid_options
|
207
|
+
#
|
208
|
+
# @return [ Array<Symbol> ] The valid options.
|
209
|
+
#
|
210
|
+
# @since 2.1.0
|
211
|
+
def valid_options
|
212
|
+
[ :autobuild, :cyclic, :polymorphic ]
|
213
|
+
end
|
214
|
+
|
215
|
+
# Get the default validation setting for the relation. Determines if
|
216
|
+
# by default a validates associated will occur.
|
217
|
+
#
|
218
|
+
# @example Get the validation default.
|
219
|
+
# Proxy.validation_default
|
220
|
+
#
|
221
|
+
# @return [ true, false ] The validation default.
|
222
|
+
#
|
223
|
+
# @since 2.1.9
|
224
|
+
def validation_default
|
225
|
+
false
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|