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,639 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/relations/embedded/batchable"
|
3
|
+
|
4
|
+
module Mongoid
|
5
|
+
module Relations
|
6
|
+
module Embedded
|
7
|
+
|
8
|
+
# This class handles the behaviour for a document that embeds many other
|
9
|
+
# documents within in it as an array.
|
10
|
+
class Many < Relations::Many
|
11
|
+
include Batchable
|
12
|
+
|
13
|
+
# Appends a document or array of documents to the relation. Will set
|
14
|
+
# the parent and update the index in the process.
|
15
|
+
#
|
16
|
+
# @example Append a document.
|
17
|
+
# person.addresses << address
|
18
|
+
#
|
19
|
+
# @example Push a document.
|
20
|
+
# person.addresses.push(address)
|
21
|
+
#
|
22
|
+
# @param [ Document, Array<Document> ] *args Any number of documents.
|
23
|
+
def <<(*args)
|
24
|
+
docs = args.flatten
|
25
|
+
return concat(docs) if docs.size > 1
|
26
|
+
if doc = docs.first
|
27
|
+
append(doc)
|
28
|
+
doc.save if persistable? && !_assigning?
|
29
|
+
end
|
30
|
+
self
|
31
|
+
end
|
32
|
+
alias :push :<<
|
33
|
+
|
34
|
+
# Get this relation as as its representation in the database.
|
35
|
+
#
|
36
|
+
# @example Convert the relation to an attributes hash.
|
37
|
+
# person.addresses.as_document
|
38
|
+
#
|
39
|
+
# @return [ Array<Hash> ] The relation as stored in the db.
|
40
|
+
#
|
41
|
+
# @since 2.0.0.rc.1
|
42
|
+
def as_document
|
43
|
+
attributes = []
|
44
|
+
_unscoped.each do |doc|
|
45
|
+
attributes.push(doc.as_document)
|
46
|
+
end
|
47
|
+
attributes
|
48
|
+
end
|
49
|
+
|
50
|
+
# Appends an array of documents to the relation. Performs a batch
|
51
|
+
# insert of the documents instead of persisting one at a time.
|
52
|
+
#
|
53
|
+
# @example Concat with other documents.
|
54
|
+
# person.addresses.concat([ address_one, address_two ])
|
55
|
+
#
|
56
|
+
# @param [ Array<Document> ] docs The docs to add.
|
57
|
+
#
|
58
|
+
# @return [ Array<Document> ] The documents.
|
59
|
+
#
|
60
|
+
# @since 2.4.0
|
61
|
+
def concat(docs)
|
62
|
+
batch_insert(docs) unless docs.empty?
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
# Builds a new document in the relation and appends it to the target.
|
67
|
+
# Takes an optional type if you want to specify a subclass.
|
68
|
+
#
|
69
|
+
# @example Build a new document on the relation.
|
70
|
+
# person.people.build(:name => "Bozo")
|
71
|
+
#
|
72
|
+
# @overload build(attributes = {}, options = {}, type = nil)
|
73
|
+
# @param [ Hash ] attributes The attributes to build the document with.
|
74
|
+
# @param [ Class ] type Optional class to build the document with.
|
75
|
+
#
|
76
|
+
# @overload build(attributes = {}, type = nil)
|
77
|
+
# @param [ Hash ] attributes The attributes to build the document with.
|
78
|
+
# @param [ Class ] type Optional class to build the document with.
|
79
|
+
#
|
80
|
+
# @return [ Document ] The new document.
|
81
|
+
def build(attributes = {}, type = nil)
|
82
|
+
doc = Factory.build(type || metadata.klass, attributes)
|
83
|
+
append(doc)
|
84
|
+
doc.apply_post_processed_defaults
|
85
|
+
yield(doc) if block_given?
|
86
|
+
doc.run_callbacks(:build) { doc }
|
87
|
+
doc
|
88
|
+
end
|
89
|
+
alias :new :build
|
90
|
+
|
91
|
+
# Clear the relation. Will delete the documents from the db if they are
|
92
|
+
# already persisted.
|
93
|
+
#
|
94
|
+
# @example Clear the relation.
|
95
|
+
# person.addresses.clear
|
96
|
+
#
|
97
|
+
# @return [ Many ] The empty relation.
|
98
|
+
def clear
|
99
|
+
batch_clear(target.dup)
|
100
|
+
self
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns a count of the number of documents in the association that have
|
104
|
+
# actually been persisted to the database.
|
105
|
+
#
|
106
|
+
# Use #size if you want the total number of documents.
|
107
|
+
#
|
108
|
+
# @example Get the count of persisted documents.
|
109
|
+
# person.addresses.count
|
110
|
+
#
|
111
|
+
# @return [ Integer ] The total number of persisted embedded docs, as
|
112
|
+
# flagged by the #persisted? method.
|
113
|
+
def count
|
114
|
+
target.select { |doc| doc.persisted? }.size
|
115
|
+
end
|
116
|
+
|
117
|
+
# Delete the supplied document from the target. This method is proxied
|
118
|
+
# in order to reindex the array after the operation occurs.
|
119
|
+
#
|
120
|
+
# @example Delete the document from the relation.
|
121
|
+
# person.addresses.delete(address)
|
122
|
+
#
|
123
|
+
# @param [ Document ] document The document to be deleted.
|
124
|
+
#
|
125
|
+
# @return [ Document, nil ] The deleted document or nil if nothing deleted.
|
126
|
+
#
|
127
|
+
# @since 2.0.0.rc.1
|
128
|
+
def delete(document)
|
129
|
+
execute_callback :before_remove, document
|
130
|
+
doc = target.delete_one(document)
|
131
|
+
if doc && !_binding?
|
132
|
+
_unscoped.delete_one(doc)
|
133
|
+
if _assigning?
|
134
|
+
base.add_atomic_pull(doc)
|
135
|
+
else
|
136
|
+
doc.delete(suppress: true)
|
137
|
+
unbind_one(doc)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
reindex
|
141
|
+
execute_callback :after_remove, document
|
142
|
+
doc
|
143
|
+
end
|
144
|
+
|
145
|
+
# Delete all the documents in the association without running callbacks.
|
146
|
+
#
|
147
|
+
# @example Delete all documents from the relation.
|
148
|
+
# person.addresses.delete_all
|
149
|
+
#
|
150
|
+
# @example Conditionally delete documents from the relation.
|
151
|
+
# person.addresses.delete_all({ :street => "Bond" })
|
152
|
+
#
|
153
|
+
# @param [ Hash ] conditions Conditions on which documents to delete.
|
154
|
+
#
|
155
|
+
# @return [ Integer ] The number of documents deleted.
|
156
|
+
def delete_all(conditions = {})
|
157
|
+
remove_all(conditions, :delete)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Delete all the documents for which the provided block returns true.
|
161
|
+
#
|
162
|
+
# @example Delete the matching documents.
|
163
|
+
# person.addresses.delete_if do |doc|
|
164
|
+
# doc.state = "GA"
|
165
|
+
# end
|
166
|
+
#
|
167
|
+
# @return [ Many, Enumerator ] The relation or an enumerator if no
|
168
|
+
# block was provided.
|
169
|
+
#
|
170
|
+
# @since 3.1.0
|
171
|
+
def delete_if
|
172
|
+
if block_given?
|
173
|
+
target.each do |doc|
|
174
|
+
delete(doc) if yield(doc)
|
175
|
+
end
|
176
|
+
self
|
177
|
+
else
|
178
|
+
super
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# Destroy all the documents in the association whilst running callbacks.
|
183
|
+
#
|
184
|
+
# @example Destroy all documents from the relation.
|
185
|
+
# person.addresses.destroy_all
|
186
|
+
#
|
187
|
+
# @example Conditionally destroy documents from the relation.
|
188
|
+
# person.addresses.destroy_all({ :street => "Bond" })
|
189
|
+
#
|
190
|
+
# @param [ Hash ] conditions Conditions on which documents to destroy.
|
191
|
+
#
|
192
|
+
# @return [ Integer ] The number of documents destroyed.
|
193
|
+
def destroy_all(conditions = {})
|
194
|
+
remove_all(conditions, :destroy)
|
195
|
+
end
|
196
|
+
|
197
|
+
# Determine if any documents in this relation exist in the database.
|
198
|
+
#
|
199
|
+
# @example Are there persisted documents?
|
200
|
+
# person.posts.exists?
|
201
|
+
#
|
202
|
+
# @return [ true, false ] True is persisted documents exist, false if not.
|
203
|
+
def exists?
|
204
|
+
count > 0
|
205
|
+
end
|
206
|
+
|
207
|
+
# Finds a document in this association through several different
|
208
|
+
# methods.
|
209
|
+
#
|
210
|
+
# @example Find a document by its id.
|
211
|
+
# person.addresses.find(Moped::BSON::ObjectId.new)
|
212
|
+
#
|
213
|
+
# @example Find documents for multiple ids.
|
214
|
+
# person.addresses.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
|
215
|
+
#
|
216
|
+
# @param [ Array<Object> ] args Various arguments.
|
217
|
+
#
|
218
|
+
# @return [ Array<Document>, Document ] A single or multiple documents.
|
219
|
+
def find(*args)
|
220
|
+
criteria.find(*args)
|
221
|
+
end
|
222
|
+
|
223
|
+
# Instantiate a new embeds_many relation.
|
224
|
+
#
|
225
|
+
# @example Create the new relation.
|
226
|
+
# Many.new(person, addresses, metadata)
|
227
|
+
#
|
228
|
+
# @param [ Document ] base The document this relation hangs off of.
|
229
|
+
# @param [ Array<Document> ] target The child documents of the relation.
|
230
|
+
# @param [ Metadata ] metadata The relation's metadata
|
231
|
+
#
|
232
|
+
# @return [ Many ] The proxy.
|
233
|
+
def initialize(base, target, metadata)
|
234
|
+
init(base, target, metadata) do
|
235
|
+
target.each_with_index do |doc, index|
|
236
|
+
integrate(doc)
|
237
|
+
doc._index = index
|
238
|
+
end
|
239
|
+
@_unscoped = target.dup
|
240
|
+
@target = scope(target)
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
# Get all the documents in the relation that are loaded into memory.
|
245
|
+
#
|
246
|
+
# @example Get the in memory documents.
|
247
|
+
# relation.in_memory
|
248
|
+
#
|
249
|
+
# @return [ Array<Document> ] The documents in memory.
|
250
|
+
#
|
251
|
+
# @since 2.1.0
|
252
|
+
def in_memory
|
253
|
+
target
|
254
|
+
end
|
255
|
+
|
256
|
+
# Pop documents off the relation. This can be a single document or
|
257
|
+
# multiples, and will automatically persist the changes.
|
258
|
+
#
|
259
|
+
# @example Pop a single document.
|
260
|
+
# relation.pop
|
261
|
+
#
|
262
|
+
# @example Pop multiple documents.
|
263
|
+
# relation.pop(3)
|
264
|
+
#
|
265
|
+
# @param [ Integer ] count The number of documents to pop, or 1 if not
|
266
|
+
# provided.
|
267
|
+
#
|
268
|
+
# @return [ Document, Array<Document> ] The popped document(s).
|
269
|
+
#
|
270
|
+
# @since 3.0.0
|
271
|
+
def pop(count = nil)
|
272
|
+
if count
|
273
|
+
if docs = target[target.size - count, target.size]
|
274
|
+
docs.each { |doc| delete(doc) }
|
275
|
+
end
|
276
|
+
else
|
277
|
+
delete(target[-1])
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
# Substitutes the supplied target documents for the existing documents
|
282
|
+
# in the relation.
|
283
|
+
#
|
284
|
+
# @example Substitute the relation's target.
|
285
|
+
# person.addresses.substitute([ address ])
|
286
|
+
#
|
287
|
+
# @param [ Array<Document> ] docs The replacement docs.
|
288
|
+
#
|
289
|
+
# @return [ Many ] The proxied relation.
|
290
|
+
#
|
291
|
+
# @since 2.0.0.rc.1
|
292
|
+
def substitute(docs)
|
293
|
+
batch_replace(docs)
|
294
|
+
self
|
295
|
+
end
|
296
|
+
|
297
|
+
# Return the relation with all previous scoping removed. This is the
|
298
|
+
# exact representation of the docs in the database.
|
299
|
+
#
|
300
|
+
# @example Get the unscoped documents.
|
301
|
+
# person.addresses.unscoped
|
302
|
+
#
|
303
|
+
# @return [ Criteria ] The unscoped relation.
|
304
|
+
#
|
305
|
+
# @since 2.4.0
|
306
|
+
def unscoped
|
307
|
+
criterion = klass.unscoped
|
308
|
+
criterion.embedded = true
|
309
|
+
criterion.documents = _unscoped.delete_if(&:marked_for_destruction?)
|
310
|
+
criterion
|
311
|
+
end
|
312
|
+
|
313
|
+
private
|
314
|
+
|
315
|
+
# Appends the document to the target array, updating the index on the
|
316
|
+
# document at the same time.
|
317
|
+
#
|
318
|
+
# @example Append to the document.
|
319
|
+
# relation.append(document)
|
320
|
+
#
|
321
|
+
# @param [ Document ] document The document to append to the target.
|
322
|
+
#
|
323
|
+
# @since 2.0.0.rc.1
|
324
|
+
def append(document)
|
325
|
+
execute_callback :before_add, document
|
326
|
+
target.push(*scope([document]))
|
327
|
+
_unscoped.push(document)
|
328
|
+
integrate(document)
|
329
|
+
document._index = _unscoped.size - 1
|
330
|
+
execute_callback :after_add, document
|
331
|
+
end
|
332
|
+
|
333
|
+
# Instantiate the binding associated with this relation.
|
334
|
+
#
|
335
|
+
# @example Create the binding.
|
336
|
+
# relation.binding([ address ])
|
337
|
+
#
|
338
|
+
# @param [ Array<Document> ] new_target The new documents to bind with.
|
339
|
+
#
|
340
|
+
# @return [ Binding ] The many binding.
|
341
|
+
#
|
342
|
+
# @since 2.0.0.rc.1
|
343
|
+
def binding
|
344
|
+
Bindings::Embedded::Many.new(base, target, metadata)
|
345
|
+
end
|
346
|
+
|
347
|
+
# Returns the criteria object for the target class with its documents set
|
348
|
+
# to target.
|
349
|
+
#
|
350
|
+
# @example Get a criteria for the relation.
|
351
|
+
# relation.criteria
|
352
|
+
#
|
353
|
+
# @return [ Criteria ] A new criteria.
|
354
|
+
def criteria
|
355
|
+
criterion = klass.scoped
|
356
|
+
criterion.embedded = true
|
357
|
+
criterion.documents = target
|
358
|
+
Many.apply_ordering(criterion, metadata)
|
359
|
+
end
|
360
|
+
|
361
|
+
# Deletes one document from the target and unscoped.
|
362
|
+
#
|
363
|
+
# @api private
|
364
|
+
#
|
365
|
+
# @example Delete one document.
|
366
|
+
# relation.delete_one(doc)
|
367
|
+
#
|
368
|
+
# @param [ Document ] document The document to delete.
|
369
|
+
#
|
370
|
+
# @since 2.4.7
|
371
|
+
def delete_one(document)
|
372
|
+
target.delete_one(document)
|
373
|
+
_unscoped.delete_one(document)
|
374
|
+
reindex
|
375
|
+
end
|
376
|
+
|
377
|
+
# Integrate the document into the relation. will set its metadata and
|
378
|
+
# attempt to bind the inverse.
|
379
|
+
#
|
380
|
+
# @example Integrate the document.
|
381
|
+
# relation.integrate(document)
|
382
|
+
#
|
383
|
+
# @param [ Document ] document The document to integrate.
|
384
|
+
#
|
385
|
+
# @since 2.1.0
|
386
|
+
def integrate(document)
|
387
|
+
characterize_one(document)
|
388
|
+
bind_one(document)
|
389
|
+
end
|
390
|
+
|
391
|
+
# If the target array does not respond to the supplied method then try to
|
392
|
+
# find a named scope or criteria on the class and send the call there.
|
393
|
+
#
|
394
|
+
# If the method exists on the array, use the default proxy behavior.
|
395
|
+
#
|
396
|
+
# @param [ Symbol, String ] name The name of the method.
|
397
|
+
# @param [ Array ] args The method args
|
398
|
+
# @param [ Proc ] block Optional block to pass.
|
399
|
+
#
|
400
|
+
# @return [ Criteria, Object ] A Criteria or return value from the target.
|
401
|
+
def method_missing(name, *args, &block)
|
402
|
+
return super if target.respond_to?(name)
|
403
|
+
klass.send(:with_scope, criteria) do
|
404
|
+
criteria.send(name, *args, &block)
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
# Are we able to persist this relation?
|
409
|
+
#
|
410
|
+
# @example Can we persist the relation?
|
411
|
+
# relation.persistable?
|
412
|
+
#
|
413
|
+
# @return [ true, false ] If the relation is persistable.
|
414
|
+
#
|
415
|
+
# @since 2.1.0
|
416
|
+
def persistable?
|
417
|
+
base.persisted? && !_binding?
|
418
|
+
end
|
419
|
+
|
420
|
+
# Reindex all the target elements. This is useful when performing
|
421
|
+
# operations on the proxied target directly and the indices need to
|
422
|
+
# match that on the database side.
|
423
|
+
#
|
424
|
+
# @example Reindex the relation.
|
425
|
+
# person.addresses.reindex
|
426
|
+
#
|
427
|
+
# @since 2.0.0.rc.1
|
428
|
+
def reindex
|
429
|
+
_unscoped.each_with_index do |doc, index|
|
430
|
+
doc._index = index
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
# Apply the metadata ordering or the default scoping to the provided
|
435
|
+
# documents.
|
436
|
+
#
|
437
|
+
# @example Apply scoping.
|
438
|
+
# person.addresses.scope(target)
|
439
|
+
#
|
440
|
+
# @param [ Array<Document> ] docs The documents to scope.
|
441
|
+
#
|
442
|
+
# @return [ Array<Document> ] The scoped docs.
|
443
|
+
#
|
444
|
+
# @since 2.4.0
|
445
|
+
def scope(docs)
|
446
|
+
return docs unless metadata.order || metadata.klass.default_scoping?
|
447
|
+
crit = metadata.klass.order_by(metadata.order)
|
448
|
+
crit.embedded = true
|
449
|
+
crit.documents = docs
|
450
|
+
crit.entries
|
451
|
+
end
|
452
|
+
|
453
|
+
# Remove all documents from the relation, either with a delete or a
|
454
|
+
# destroy depending on what this was called through.
|
455
|
+
#
|
456
|
+
# @example Destroy documents from the relation.
|
457
|
+
# relation.remove_all({ :num => 1 }, true)
|
458
|
+
#
|
459
|
+
# @param [ Hash ] conditions Conditions to filter by.
|
460
|
+
# @param [ true, false ] destroy If true then destroy, else delete.
|
461
|
+
#
|
462
|
+
# @return [ Integer ] The number of documents removed.
|
463
|
+
def remove_all(conditions = {}, method = :delete)
|
464
|
+
criteria = where(conditions || {})
|
465
|
+
removed = criteria.size
|
466
|
+
batch_remove(criteria, method)
|
467
|
+
removed
|
468
|
+
end
|
469
|
+
|
470
|
+
# Get the internal unscoped documents.
|
471
|
+
#
|
472
|
+
# @example Get the unscoped documents.
|
473
|
+
# relation._unscoped
|
474
|
+
#
|
475
|
+
# @return [ Array<Document> ] The unscoped documents.
|
476
|
+
#
|
477
|
+
# @since 2.4.0
|
478
|
+
def _unscoped
|
479
|
+
@_unscoped ||= []
|
480
|
+
end
|
481
|
+
|
482
|
+
# Set the internal unscoped documents.
|
483
|
+
#
|
484
|
+
# @example Set the unscoped documents.
|
485
|
+
# relation._unscoped = docs
|
486
|
+
#
|
487
|
+
# @param [ Array<Document> ] docs The documents.
|
488
|
+
#
|
489
|
+
# @return [ Array<Document ] The unscoped docs.
|
490
|
+
#
|
491
|
+
# @since 2.4.0
|
492
|
+
def _unscoped=(docs)
|
493
|
+
@_unscoped = docs
|
494
|
+
end
|
495
|
+
|
496
|
+
class << self
|
497
|
+
|
498
|
+
# Return the builder that is responsible for generating the documents
|
499
|
+
# that will be used by this relation.
|
500
|
+
#
|
501
|
+
# @example Get the builder.
|
502
|
+
# Embedded::Many.builder(meta, object)
|
503
|
+
#
|
504
|
+
# @param [ Document ] base The base document.
|
505
|
+
# @param [ Metadata ] meta The metadata of the relation.
|
506
|
+
# @param [ Document, Hash ] object A document or attributes to build
|
507
|
+
# with.
|
508
|
+
#
|
509
|
+
# @return [ Builder ] A newly instantiated builder object.
|
510
|
+
#
|
511
|
+
# @since 2.0.0.rc.1
|
512
|
+
def builder(base, meta, object)
|
513
|
+
Builders::Embedded::Many.new(base, meta, object)
|
514
|
+
end
|
515
|
+
|
516
|
+
# Returns true if the relation is an embedded one. In this case
|
517
|
+
# always true.
|
518
|
+
#
|
519
|
+
# @example Is the relation embedded?
|
520
|
+
# Embedded::Many.embedded?
|
521
|
+
#
|
522
|
+
# @return [ true ] true.
|
523
|
+
#
|
524
|
+
# @since 2.0.0.rc.1
|
525
|
+
def embedded?
|
526
|
+
true
|
527
|
+
end
|
528
|
+
|
529
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
530
|
+
#
|
531
|
+
# @example Get the suffix for the foreign key.
|
532
|
+
# Referenced::Many.foreign_key_suffix
|
533
|
+
#
|
534
|
+
# @return [ nil ] nil.
|
535
|
+
#
|
536
|
+
# @since 3.0.0
|
537
|
+
def foreign_key_suffix
|
538
|
+
nil
|
539
|
+
end
|
540
|
+
|
541
|
+
# Returns the macro for this relation. Used mostly as a helper in
|
542
|
+
# reflection.
|
543
|
+
#
|
544
|
+
# @example Get the relation macro.
|
545
|
+
# Mongoid::Relations::Embedded::Many.macro
|
546
|
+
#
|
547
|
+
# @return [ Symbol ] :embeds_many
|
548
|
+
#
|
549
|
+
# @since 2.0.0.rc.1
|
550
|
+
def macro
|
551
|
+
:embeds_many
|
552
|
+
end
|
553
|
+
|
554
|
+
# Return the nested builder that is responsible for generating the
|
555
|
+
# documents that will be used by this relation.
|
556
|
+
#
|
557
|
+
# @example Get the nested builder.
|
558
|
+
# NestedAttributes::Many.builder(attributes, options)
|
559
|
+
#
|
560
|
+
# @param [ Metadata ] metadata The relation metadata.
|
561
|
+
# @param [ Hash ] attributes The attributes to build with.
|
562
|
+
# @param [ Hash ] options The builder options.
|
563
|
+
#
|
564
|
+
# @option options [ true, false ] :allow_destroy Can documents be
|
565
|
+
# deleted?
|
566
|
+
# @option options [ Integer ] :limit Max number of documents to
|
567
|
+
# create at once.
|
568
|
+
# @option options [ Proc, Symbol ] :reject_if If documents match this
|
569
|
+
# option then they are ignored.
|
570
|
+
# @option options [ true, false ] :update_only Only existing documents
|
571
|
+
# can be modified.
|
572
|
+
#
|
573
|
+
# @return [ NestedBuilder ] The nested attributes builder.
|
574
|
+
#
|
575
|
+
# @since 2.0.0.rc.1
|
576
|
+
def nested_builder(metadata, attributes, options)
|
577
|
+
Builders::NestedAttributes::Many.new(metadata, attributes, options)
|
578
|
+
end
|
579
|
+
|
580
|
+
# Get the path calculator for the supplied document.
|
581
|
+
#
|
582
|
+
# @example Get the path calculator.
|
583
|
+
# Proxy.path(document)
|
584
|
+
#
|
585
|
+
# @param [ Document ] document The document to calculate on.
|
586
|
+
#
|
587
|
+
# @return [ Mongoid::Atomic::Paths::Embedded::Many ]
|
588
|
+
# The embedded many atomic path calculator.
|
589
|
+
#
|
590
|
+
# @since 2.1.0
|
591
|
+
def path(document)
|
592
|
+
Mongoid::Atomic::Paths::Embedded::Many.new(document)
|
593
|
+
end
|
594
|
+
|
595
|
+
# Tells the caller if this relation is one that stores the foreign
|
596
|
+
# key on its own objects.
|
597
|
+
#
|
598
|
+
# @example Does this relation store a foreign key?
|
599
|
+
# Embedded::Many.stores_foreign_key?
|
600
|
+
#
|
601
|
+
# @return [ false ] false.
|
602
|
+
#
|
603
|
+
# @since 2.0.0.rc.1
|
604
|
+
def stores_foreign_key?
|
605
|
+
false
|
606
|
+
end
|
607
|
+
|
608
|
+
# Get the valid options allowed with this relation.
|
609
|
+
#
|
610
|
+
# @example Get the valid options.
|
611
|
+
# Relation.valid_options
|
612
|
+
#
|
613
|
+
# @return [ Array<Symbol> ] The valid options.
|
614
|
+
#
|
615
|
+
# @since 2.1.0
|
616
|
+
def valid_options
|
617
|
+
[
|
618
|
+
:as, :cascade_callbacks, :cyclic, :order, :store_as,
|
619
|
+
:before_add, :after_add, :before_remove, :after_remove
|
620
|
+
]
|
621
|
+
end
|
622
|
+
|
623
|
+
# Get the default validation setting for the relation. Determines if
|
624
|
+
# by default a validates associated will occur.
|
625
|
+
#
|
626
|
+
# @example Get the validation default.
|
627
|
+
# Proxy.validation_default
|
628
|
+
#
|
629
|
+
# @return [ true, false ] The validation default.
|
630
|
+
#
|
631
|
+
# @since 2.1.9
|
632
|
+
def validation_default
|
633
|
+
true
|
634
|
+
end
|
635
|
+
end
|
636
|
+
end
|
637
|
+
end
|
638
|
+
end
|
639
|
+
end
|