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,486 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Referenced
|
5
|
+
|
6
|
+
# This class defines the behaviour for all relations that are a
|
7
|
+
# many-to-many between documents in different collections.
|
8
|
+
class ManyToMany < Many
|
9
|
+
|
10
|
+
# Appends a document or array of documents to the relation. Will set
|
11
|
+
# the parent and update the index in the process.
|
12
|
+
#
|
13
|
+
# @example Append a document.
|
14
|
+
# person.posts << post
|
15
|
+
#
|
16
|
+
# @example Push a document.
|
17
|
+
# person.posts.push(post)
|
18
|
+
#
|
19
|
+
# @example Concat with other documents.
|
20
|
+
# person.posts.concat([ post_one, post_two ])
|
21
|
+
#
|
22
|
+
# @param [ Document, Array<Document> ] *args Any number of documents.
|
23
|
+
#
|
24
|
+
# @return [ Array<Document> ] The loaded docs.
|
25
|
+
#
|
26
|
+
# @since 2.0.0.beta.1
|
27
|
+
def <<(*args)
|
28
|
+
docs = args.flatten
|
29
|
+
return concat(docs) if docs.size > 1
|
30
|
+
if doc = docs.first
|
31
|
+
append(doc)
|
32
|
+
base.add_to_set(foreign_key => doc.send(metadata.primary_key))
|
33
|
+
if child_persistable?(doc)
|
34
|
+
doc.save
|
35
|
+
end
|
36
|
+
end
|
37
|
+
unsynced(base, foreign_key) and self
|
38
|
+
end
|
39
|
+
alias :push :<<
|
40
|
+
|
41
|
+
# Appends an array of documents to the relation. Performs a batch
|
42
|
+
# insert of the documents instead of persisting one at a time.
|
43
|
+
#
|
44
|
+
# @example Concat with other documents.
|
45
|
+
# person.posts.concat([ post_one, post_two ])
|
46
|
+
#
|
47
|
+
# @param [ Array<Document> ] documents The docs to add.
|
48
|
+
#
|
49
|
+
# @return [ Array<Document> ] The documents.
|
50
|
+
#
|
51
|
+
# @since 2.4.0
|
52
|
+
def concat(documents)
|
53
|
+
ids, docs, inserts = {}, [], []
|
54
|
+
documents.each do |doc|
|
55
|
+
next unless doc
|
56
|
+
append(doc)
|
57
|
+
if persistable? || _creating?
|
58
|
+
ids[doc.id] = true
|
59
|
+
save_or_delay(doc, docs, inserts)
|
60
|
+
else
|
61
|
+
existing = base.send(foreign_key)
|
62
|
+
unless existing.include?(doc.id)
|
63
|
+
existing.push(doc.id) and unsynced(base, foreign_key)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
if persistable? || _creating?
|
68
|
+
base.push(foreign_key => ids.keys)
|
69
|
+
end
|
70
|
+
persist_delayed(docs, inserts)
|
71
|
+
self
|
72
|
+
end
|
73
|
+
|
74
|
+
# Build a new document from the attributes and append it to this
|
75
|
+
# relation without saving.
|
76
|
+
#
|
77
|
+
# @example Build a new document on the relation.
|
78
|
+
# person.posts.build(:title => "A new post")
|
79
|
+
#
|
80
|
+
# @overload build(attributes = {}, type = nil)
|
81
|
+
# @param [ Hash ] attributes The attributes of the new document.
|
82
|
+
# @param [ Class ] type The optional subclass to build.
|
83
|
+
#
|
84
|
+
# @overload build(attributes = {}, type = nil)
|
85
|
+
# @param [ Hash ] attributes The attributes of the new document.
|
86
|
+
# @param [ Class ] type The optional subclass to build.
|
87
|
+
#
|
88
|
+
# @return [ Document ] The new document.
|
89
|
+
#
|
90
|
+
# @since 2.0.0.beta.1
|
91
|
+
def build(attributes = {}, type = nil)
|
92
|
+
doc = Factory.build(type || klass, attributes)
|
93
|
+
base.send(foreign_key).push(doc.id)
|
94
|
+
append(doc)
|
95
|
+
doc.apply_post_processed_defaults
|
96
|
+
unsynced(doc, inverse_foreign_key)
|
97
|
+
yield(doc) if block_given?
|
98
|
+
doc
|
99
|
+
end
|
100
|
+
alias :new :build
|
101
|
+
|
102
|
+
# Delete the document from the relation. This will set the foreign key
|
103
|
+
# on the document to nil. If the dependent options on the relation are
|
104
|
+
# :delete or :destroy the appropriate removal will occur.
|
105
|
+
#
|
106
|
+
# @example Delete the document.
|
107
|
+
# person.posts.delete(post)
|
108
|
+
#
|
109
|
+
# @param [ Document ] document The document to remove.
|
110
|
+
#
|
111
|
+
# @return [ Document ] The matching document.
|
112
|
+
#
|
113
|
+
# @since 2.1.0
|
114
|
+
def delete(document)
|
115
|
+
doc = super
|
116
|
+
if doc && persistable?
|
117
|
+
base.pull(foreign_key => doc.send(metadata.primary_key))
|
118
|
+
target._unloaded = criteria
|
119
|
+
unsynced(base, foreign_key)
|
120
|
+
end
|
121
|
+
doc
|
122
|
+
end
|
123
|
+
|
124
|
+
# Removes all associations between the base document and the target
|
125
|
+
# documents by deleting the foreign keys and the references, orphaning
|
126
|
+
# the target documents in the process.
|
127
|
+
#
|
128
|
+
# @example Nullify the relation.
|
129
|
+
# person.preferences.nullify
|
130
|
+
#
|
131
|
+
# @since 2.0.0.rc.1
|
132
|
+
def nullify
|
133
|
+
target.each do |doc|
|
134
|
+
execute_callback :before_remove, doc
|
135
|
+
end
|
136
|
+
unless metadata.forced_nil_inverse?
|
137
|
+
criteria.pull(inverse_foreign_key => base.id)
|
138
|
+
end
|
139
|
+
if persistable?
|
140
|
+
base.set(foreign_key => base.send(foreign_key).clear)
|
141
|
+
end
|
142
|
+
after_remove_error = nil
|
143
|
+
many_to_many = target.clear do |doc|
|
144
|
+
unbind_one(doc)
|
145
|
+
unless metadata.forced_nil_inverse?
|
146
|
+
doc.changed_attributes.delete(inverse_foreign_key)
|
147
|
+
end
|
148
|
+
begin
|
149
|
+
execute_callback :after_remove, doc
|
150
|
+
rescue => e
|
151
|
+
after_remove_error = e
|
152
|
+
end
|
153
|
+
end
|
154
|
+
raise after_remove_error if after_remove_error
|
155
|
+
many_to_many
|
156
|
+
end
|
157
|
+
alias :nullify_all :nullify
|
158
|
+
alias :clear :nullify
|
159
|
+
alias :purge :nullify
|
160
|
+
|
161
|
+
# Substitutes the supplied target documents for the existing documents
|
162
|
+
# in the relation. If the new target is nil, perform the necessary
|
163
|
+
# deletion.
|
164
|
+
#
|
165
|
+
# @example Replace the relation.
|
166
|
+
# person.preferences.substitute([ new_post ])
|
167
|
+
#
|
168
|
+
# @param [ Array<Document> ] replacement The replacement target.
|
169
|
+
#
|
170
|
+
# @return [ Many ] The relation.
|
171
|
+
#
|
172
|
+
# @since 2.0.0.rc.1
|
173
|
+
def substitute(replacement)
|
174
|
+
purge
|
175
|
+
unless replacement.blank?
|
176
|
+
push(replacement.compact.uniq)
|
177
|
+
else
|
178
|
+
reset_unloaded
|
179
|
+
end
|
180
|
+
self
|
181
|
+
end
|
182
|
+
|
183
|
+
# Get a criteria for the documents without the default scoping
|
184
|
+
# applied.
|
185
|
+
#
|
186
|
+
# @example Get the unscoped criteria.
|
187
|
+
# person.preferences.unscoped
|
188
|
+
#
|
189
|
+
# @return [ Criteria ] The unscoped criteria.
|
190
|
+
#
|
191
|
+
# @since 2.4.0
|
192
|
+
def unscoped
|
193
|
+
klass.unscoped.any_in(_id: base.send(foreign_key))
|
194
|
+
end
|
195
|
+
|
196
|
+
private
|
197
|
+
|
198
|
+
# Appends the document to the target array, updating the index on the
|
199
|
+
# document at the same time.
|
200
|
+
#
|
201
|
+
# @example Append the document to the relation.
|
202
|
+
# relation.append(document)
|
203
|
+
#
|
204
|
+
# @param [ Document ] document The document to append to the target.
|
205
|
+
#
|
206
|
+
# @since 2.0.0.rc.1
|
207
|
+
def append(document)
|
208
|
+
execute_callback :before_add, document
|
209
|
+
target.push(document)
|
210
|
+
characterize_one(document)
|
211
|
+
bind_one(document)
|
212
|
+
execute_callback :after_add, document
|
213
|
+
end
|
214
|
+
|
215
|
+
# Instantiate the binding associated with this relation.
|
216
|
+
#
|
217
|
+
# @example Get the binding.
|
218
|
+
# relation.binding([ address ])
|
219
|
+
#
|
220
|
+
# @return [ Binding ] The binding.
|
221
|
+
#
|
222
|
+
# @since 2.0.0.rc.1
|
223
|
+
def binding
|
224
|
+
Bindings::Referenced::ManyToMany.new(base, target, metadata)
|
225
|
+
end
|
226
|
+
|
227
|
+
# Determine if the child document should be persisted.
|
228
|
+
#
|
229
|
+
# @api private
|
230
|
+
#
|
231
|
+
# @example Is the child persistable?
|
232
|
+
# relation.child_persistable?(doc)
|
233
|
+
#
|
234
|
+
# @param [ Document ] doc The document.
|
235
|
+
#
|
236
|
+
# @return [ true, false ] If the document can be persisted.
|
237
|
+
#
|
238
|
+
# @since 3.0.20
|
239
|
+
def child_persistable?(doc)
|
240
|
+
(persistable? || _creating?) &&
|
241
|
+
!(doc.persisted? && metadata.forced_nil_inverse?)
|
242
|
+
end
|
243
|
+
|
244
|
+
# Returns the criteria object for the target class with its documents set
|
245
|
+
# to target.
|
246
|
+
#
|
247
|
+
# @example Get a criteria for the relation.
|
248
|
+
# relation.criteria
|
249
|
+
#
|
250
|
+
# @return [ Criteria ] A new criteria.
|
251
|
+
def criteria
|
252
|
+
ManyToMany.criteria(metadata, base.send(foreign_key))
|
253
|
+
end
|
254
|
+
|
255
|
+
# Flag the base as unsynced with respect to the foreign key.
|
256
|
+
#
|
257
|
+
# @api private
|
258
|
+
#
|
259
|
+
# @example Flag as unsynced.
|
260
|
+
# relation.unsynced(doc, :preference_ids)
|
261
|
+
#
|
262
|
+
# @param [ Document ] doc The document to flag.
|
263
|
+
# @param [ Symbol ] key The key to flag on the document.
|
264
|
+
#
|
265
|
+
# @return [ true ] true.
|
266
|
+
#
|
267
|
+
# @since 3.0.0
|
268
|
+
def unsynced(doc, key)
|
269
|
+
doc.synced[key] = false
|
270
|
+
true
|
271
|
+
end
|
272
|
+
|
273
|
+
class << self
|
274
|
+
|
275
|
+
# Return the builder that is responsible for generating the documents
|
276
|
+
# that will be used by this relation.
|
277
|
+
#
|
278
|
+
# @example Get the builder.
|
279
|
+
# Referenced::ManyToMany.builder(meta, object)
|
280
|
+
#
|
281
|
+
# @param [ Document ] base The base document.
|
282
|
+
# @param [ Metadata ] meta The metadata of the relation.
|
283
|
+
# @param [ Document, Hash ] object A document or attributes to build
|
284
|
+
# with.
|
285
|
+
#
|
286
|
+
# @return [ Builder ] A new builder object.
|
287
|
+
#
|
288
|
+
# @since 2.0.0.rc.1
|
289
|
+
def builder(base, meta, object)
|
290
|
+
Builders::Referenced::ManyToMany.new(base, meta, object)
|
291
|
+
end
|
292
|
+
|
293
|
+
# Create the standard criteria for this relation given the supplied
|
294
|
+
# metadata and object.
|
295
|
+
#
|
296
|
+
# @example Get the criteria.
|
297
|
+
# Proxy.criteria(meta, object)
|
298
|
+
#
|
299
|
+
# @param [ Metadata ] metadata The relation metadata.
|
300
|
+
# @param [ Object ] object The object for the criteria.
|
301
|
+
# @param [ Class ] type The criteria class.
|
302
|
+
#
|
303
|
+
# @return [ Criteria ] The criteria.
|
304
|
+
#
|
305
|
+
# @since 2.1.0
|
306
|
+
def criteria(metadata, object, type = nil)
|
307
|
+
apply_ordering(
|
308
|
+
metadata.klass.all_of(
|
309
|
+
metadata.primary_key => { "$in" => object || [] }
|
310
|
+
), metadata
|
311
|
+
)
|
312
|
+
end
|
313
|
+
|
314
|
+
# Get the criteria that is used to eager load a relation of this
|
315
|
+
# type.
|
316
|
+
#
|
317
|
+
# @example Get the eager load criteria.
|
318
|
+
# Proxy.eager_load(metadata, criteria)
|
319
|
+
#
|
320
|
+
# @param [ Metadata ] metadata The relation metadata.
|
321
|
+
# @param [ Array<Object> ] ids The ids of the documents to load.
|
322
|
+
#
|
323
|
+
# @return [ Criteria ] The criteria to eager load the relation.
|
324
|
+
#
|
325
|
+
# @since 2.2.0
|
326
|
+
def eager_load(metadata, ids)
|
327
|
+
metadata.klass.any_in(_id: ids).each do |doc|
|
328
|
+
IdentityMap.set(doc)
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
# Returns true if the relation is an embedded one. In this case
|
333
|
+
# always false.
|
334
|
+
#
|
335
|
+
# @example Is this relation embedded?
|
336
|
+
# Referenced::ManyToMany.embedded?
|
337
|
+
#
|
338
|
+
# @return [ false ] Always false.
|
339
|
+
#
|
340
|
+
# @since 2.0.0.rc.1
|
341
|
+
def embedded?
|
342
|
+
false
|
343
|
+
end
|
344
|
+
|
345
|
+
# Get the foreign key for the provided name.
|
346
|
+
#
|
347
|
+
# @example Get the foreign key.
|
348
|
+
# Referenced::ManyToMany.foreign_key(:person)
|
349
|
+
#
|
350
|
+
# @param [ Symbol ] name The name.
|
351
|
+
#
|
352
|
+
# @return [ String ] The foreign key.
|
353
|
+
#
|
354
|
+
# @since 3.0.0
|
355
|
+
def foreign_key(name)
|
356
|
+
"#{name.to_s.singularize}#{foreign_key_suffix}"
|
357
|
+
end
|
358
|
+
|
359
|
+
# Get the default value for the foreign key.
|
360
|
+
#
|
361
|
+
# @example Get the default.
|
362
|
+
# Referenced::ManyToMany.foreign_key_default
|
363
|
+
#
|
364
|
+
# @return [ Array ] Always an empty array.
|
365
|
+
#
|
366
|
+
# @since 2.0.0.rc.1
|
367
|
+
def foreign_key_default
|
368
|
+
[]
|
369
|
+
end
|
370
|
+
|
371
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
372
|
+
#
|
373
|
+
# @example Get the suffix for the foreign key.
|
374
|
+
# Referenced::ManyToMany.foreign_key_suffix
|
375
|
+
#
|
376
|
+
# @return [ String ] "_ids"
|
377
|
+
#
|
378
|
+
# @since 2.0.0.rc.1
|
379
|
+
def foreign_key_suffix
|
380
|
+
"_ids"
|
381
|
+
end
|
382
|
+
|
383
|
+
# Returns the macro for this relation. Used mostly as a helper in
|
384
|
+
# reflection.
|
385
|
+
#
|
386
|
+
# @example Get the macro.
|
387
|
+
# Referenced::ManyToMany.macro
|
388
|
+
#
|
389
|
+
# @return [ Symbol ] :has_and_belongs_to_many
|
390
|
+
def macro
|
391
|
+
:has_and_belongs_to_many
|
392
|
+
end
|
393
|
+
|
394
|
+
# Return the nested builder that is responsible for generating the documents
|
395
|
+
# that will be used by this relation.
|
396
|
+
#
|
397
|
+
# @example Get the nested builder.
|
398
|
+
# Referenced::ManyToMany.builder(attributes, options)
|
399
|
+
#
|
400
|
+
# @param [ Metadata ] metadata The relation metadata.
|
401
|
+
# @param [ Hash ] attributes The attributes to build with.
|
402
|
+
# @param [ Hash ] options The options for the builder.
|
403
|
+
#
|
404
|
+
# @option options [ true, false ] :allow_destroy Can documents be
|
405
|
+
# deleted?
|
406
|
+
# @option options [ Integer ] :limit Max number of documents to
|
407
|
+
# create at once.
|
408
|
+
# @option options [ Proc, Symbol ] :reject_if If documents match this
|
409
|
+
# option then they are ignored.
|
410
|
+
# @option options [ true, false ] :update_only Only existing documents
|
411
|
+
# can be modified.
|
412
|
+
#
|
413
|
+
# @return [ NestedBuilder ] A newly instantiated nested builder object.
|
414
|
+
#
|
415
|
+
# @since 2.0.0.rc.1
|
416
|
+
def nested_builder(metadata, attributes, options)
|
417
|
+
Builders::NestedAttributes::Many.new(metadata, attributes, options)
|
418
|
+
end
|
419
|
+
|
420
|
+
# Get the path calculator for the supplied document.
|
421
|
+
#
|
422
|
+
# @example Get the path calculator.
|
423
|
+
# Proxy.path(document)
|
424
|
+
#
|
425
|
+
# @param [ Document ] document The document to calculate on.
|
426
|
+
#
|
427
|
+
# @return [ Root ] The root atomic path calculator.
|
428
|
+
#
|
429
|
+
# @since 2.1.0
|
430
|
+
def path(document)
|
431
|
+
Mongoid::Atomic::Paths::Root.new(document)
|
432
|
+
end
|
433
|
+
|
434
|
+
# Tells the caller if this relation is one that stores the foreign
|
435
|
+
# key on its own objects.
|
436
|
+
#
|
437
|
+
# @example Does this relation store a foreign key?
|
438
|
+
# Referenced::Many.stores_foreign_key?
|
439
|
+
#
|
440
|
+
# @return [ true ] Always true.
|
441
|
+
#
|
442
|
+
# @since 2.0.0.rc.1
|
443
|
+
def stores_foreign_key?
|
444
|
+
true
|
445
|
+
end
|
446
|
+
|
447
|
+
# Get the valid options allowed with this relation.
|
448
|
+
#
|
449
|
+
# @example Get the valid options.
|
450
|
+
# Relation.valid_options
|
451
|
+
#
|
452
|
+
# @return [ Array<Symbol> ] The valid options.
|
453
|
+
#
|
454
|
+
# @since 2.1.0
|
455
|
+
def valid_options
|
456
|
+
[
|
457
|
+
:after_add,
|
458
|
+
:after_remove,
|
459
|
+
:autosave,
|
460
|
+
:before_add,
|
461
|
+
:before_remove,
|
462
|
+
:dependent,
|
463
|
+
:foreign_key,
|
464
|
+
:index,
|
465
|
+
:order,
|
466
|
+
:primary_key
|
467
|
+
]
|
468
|
+
end
|
469
|
+
|
470
|
+
# Get the default validation setting for the relation. Determines if
|
471
|
+
# by default a validates associated will occur.
|
472
|
+
#
|
473
|
+
# @example Get the validation default.
|
474
|
+
# Proxy.validation_default
|
475
|
+
#
|
476
|
+
# @return [ true, false ] The validation default.
|
477
|
+
#
|
478
|
+
# @since 2.1.9
|
479
|
+
def validation_default
|
480
|
+
true
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
485
|
+
end
|
486
|
+
end
|