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,223 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Embedded
|
5
|
+
|
6
|
+
# This class defines the behaviour needed for embedded one to one
|
7
|
+
# relations.
|
8
|
+
class One < Relations::One
|
9
|
+
|
10
|
+
# Instantiate a new embeds_one relation.
|
11
|
+
#
|
12
|
+
# @example Create the new proxy.
|
13
|
+
# One.new(person, name, metadata)
|
14
|
+
#
|
15
|
+
# @param [ Document ] base The document this relation hangs off of.
|
16
|
+
# @param [ Document ] target The child document in the relation.
|
17
|
+
# @param [ Metadata ] metadata The relation's metadata
|
18
|
+
def initialize(base, target, metadata)
|
19
|
+
init(base, target, metadata) do
|
20
|
+
characterize_one(target)
|
21
|
+
bind_one
|
22
|
+
characterize_one(target)
|
23
|
+
target.save if persistable?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Substitutes the supplied target documents for the existing document
|
28
|
+
# in the relation.
|
29
|
+
#
|
30
|
+
# @example Substitute the new document.
|
31
|
+
# person.name.substitute(new_name)
|
32
|
+
#
|
33
|
+
# @param [ Document ] other A document to replace the target.
|
34
|
+
#
|
35
|
+
# @return [ Document, nil ] The relation or nil.
|
36
|
+
#
|
37
|
+
# @since 2.0.0.rc.1
|
38
|
+
def substitute(replacement)
|
39
|
+
if replacement != self
|
40
|
+
if _assigning?
|
41
|
+
base.add_atomic_unset(target) unless replacement
|
42
|
+
else
|
43
|
+
target.destroy if persistable?
|
44
|
+
end
|
45
|
+
unbind_one
|
46
|
+
return nil unless replacement
|
47
|
+
replacement = Factory.build(klass, replacement) if replacement.is_a?(::Hash)
|
48
|
+
self.target = replacement
|
49
|
+
bind_one
|
50
|
+
characterize_one(target)
|
51
|
+
target.save if persistable? && !_assigning?
|
52
|
+
end
|
53
|
+
self
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
# Instantiate the binding associated with this relation.
|
59
|
+
#
|
60
|
+
# @example Get the binding.
|
61
|
+
# relation.binding([ address ])
|
62
|
+
#
|
63
|
+
# @param [ Document ] new_target The new document to bind with.
|
64
|
+
#
|
65
|
+
# @return [ Binding ] The relation's binding.
|
66
|
+
#
|
67
|
+
# @since 2.0.0.rc.1
|
68
|
+
def binding
|
69
|
+
Bindings::Embedded::One.new(base, target, metadata)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Are we able to persist this relation?
|
73
|
+
#
|
74
|
+
# @example Can we persist the relation?
|
75
|
+
# relation.persistable?
|
76
|
+
#
|
77
|
+
# @return [ true, false ] If the relation is persistable.
|
78
|
+
#
|
79
|
+
# @since 2.1.0
|
80
|
+
def persistable?
|
81
|
+
base.persisted? && !_binding? && !_building? && !_assigning?
|
82
|
+
end
|
83
|
+
|
84
|
+
class << self
|
85
|
+
|
86
|
+
# Return the builder that is responsible for generating the documents
|
87
|
+
# that will be used by this relation.
|
88
|
+
#
|
89
|
+
# @example Get the builder.
|
90
|
+
# Embedded::One.builder(meta, object, person)
|
91
|
+
#
|
92
|
+
# @param [ Document ] base The base document.
|
93
|
+
# @param [ Metadata ] meta The metadata of the relation.
|
94
|
+
# @param [ Document, Hash ] object A document or attributes to build with.
|
95
|
+
#
|
96
|
+
# @return [ Builder ] A newly instantiated builder object.
|
97
|
+
#
|
98
|
+
# @since 2.0.0.rc.1
|
99
|
+
def builder(base, meta, object)
|
100
|
+
Builders::Embedded::One.new(base, meta, object)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Returns true if the relation is an embedded one. In this case
|
104
|
+
# always true.
|
105
|
+
#
|
106
|
+
# @example Is this relation embedded?
|
107
|
+
# Embedded::One.embedded?
|
108
|
+
#
|
109
|
+
# @return [ true ] true.
|
110
|
+
#
|
111
|
+
# @since 2.0.0.rc.1
|
112
|
+
def embedded?
|
113
|
+
true
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
117
|
+
#
|
118
|
+
# @example Get the suffix for the foreign key.
|
119
|
+
# Referenced::Many.foreign_key_suffix
|
120
|
+
#
|
121
|
+
# @return [ nil ] nil.
|
122
|
+
#
|
123
|
+
# @since 3.0.0
|
124
|
+
def foreign_key_suffix
|
125
|
+
nil
|
126
|
+
end
|
127
|
+
|
128
|
+
# Returns the macro for this relation. Used mostly as a helper in
|
129
|
+
# reflection.
|
130
|
+
#
|
131
|
+
# @example Get the macro.
|
132
|
+
# Mongoid::Relations::Embedded::One.macro
|
133
|
+
#
|
134
|
+
# @return [ Symbol ] :embeds_one.
|
135
|
+
#
|
136
|
+
# @since 2.0.0.rc.1
|
137
|
+
def macro
|
138
|
+
:embeds_one
|
139
|
+
end
|
140
|
+
|
141
|
+
# Return the nested builder that is responsible for generating
|
142
|
+
# the documents that will be used by this relation.
|
143
|
+
#
|
144
|
+
# @example Get the builder.
|
145
|
+
# NestedAttributes::One.builder(attributes, options)
|
146
|
+
#
|
147
|
+
# @param [ Metadata ] metadata The relation metadata.
|
148
|
+
# @param [ Hash ] attributes The attributes to build with.
|
149
|
+
# @param [ Hash ] options The options for the builder.
|
150
|
+
#
|
151
|
+
# @option options [ true, false ] :allow_destroy Can documents be
|
152
|
+
# deleted?
|
153
|
+
# @option options [ Integer ] :limit Max number of documents to
|
154
|
+
# create at once.
|
155
|
+
# @option options [ Proc, Symbol ] :reject_if If documents match this
|
156
|
+
# option then they are ignored.
|
157
|
+
# @option options [ true, false ] :update_only Only existing documents
|
158
|
+
# can be modified.
|
159
|
+
#
|
160
|
+
# @return [ Builder ] A newly instantiated nested builder object.
|
161
|
+
#
|
162
|
+
# @since 2.0.0.rc.1
|
163
|
+
def nested_builder(metadata, attributes, options)
|
164
|
+
Builders::NestedAttributes::One.new(metadata, attributes, options)
|
165
|
+
end
|
166
|
+
|
167
|
+
# Get the path calculator for the supplied document.
|
168
|
+
#
|
169
|
+
# @example Get the path calculator.
|
170
|
+
# Proxy.path(document)
|
171
|
+
#
|
172
|
+
# @param [ Document ] document The document to calculate on.
|
173
|
+
#
|
174
|
+
# @return [ Mongoid::Atomic::Paths::Embedded::One ]
|
175
|
+
# The embedded one atomic path calculator.
|
176
|
+
#
|
177
|
+
# @since 2.1.0
|
178
|
+
def path(document)
|
179
|
+
Mongoid::Atomic::Paths::Embedded::One.new(document)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Tells the caller if this relation is one that stores the foreign
|
183
|
+
# key on its own objects.
|
184
|
+
#
|
185
|
+
# @example Does this relation store a foreign key?
|
186
|
+
# Embedded::One.stores_foreign_key?
|
187
|
+
#
|
188
|
+
# @return [ false ] false.
|
189
|
+
#
|
190
|
+
# @since 2.0.0.rc.1
|
191
|
+
def stores_foreign_key?
|
192
|
+
false
|
193
|
+
end
|
194
|
+
|
195
|
+
# Get the valid options allowed with this relation.
|
196
|
+
#
|
197
|
+
# @example Get the valid options.
|
198
|
+
# Relation.valid_options
|
199
|
+
#
|
200
|
+
# @return [ Array<Symbol> ] The valid options.
|
201
|
+
#
|
202
|
+
# @since 2.1.0
|
203
|
+
def valid_options
|
204
|
+
[ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
|
205
|
+
end
|
206
|
+
|
207
|
+
# Get the default validation setting for the relation. Determines if
|
208
|
+
# by default a validates associated will occur.
|
209
|
+
#
|
210
|
+
# @example Get the validation default.
|
211
|
+
# Proxy.validation_default
|
212
|
+
#
|
213
|
+
# @return [ true, false ] The validation default.
|
214
|
+
#
|
215
|
+
# @since 2.1.9
|
216
|
+
def validation_default
|
217
|
+
true
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
@@ -0,0 +1,356 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
|
5
|
+
# This module contains the core macros for defining relations between
|
6
|
+
# documents. They can be either embedded or referenced (relational).
|
7
|
+
module Macros
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
included do
|
11
|
+
class_attribute :embedded, instance_reader: false
|
12
|
+
class_attribute :embedded_relations
|
13
|
+
class_attribute :relations
|
14
|
+
self.embedded = false
|
15
|
+
self.embedded_relations = {}
|
16
|
+
self.relations = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
# This is convenience for librarys still on the old API.
|
20
|
+
#
|
21
|
+
# @example Get the associations.
|
22
|
+
# person.associations
|
23
|
+
#
|
24
|
+
# @return [ Hash ] The relations.
|
25
|
+
#
|
26
|
+
# @since 2.3.1
|
27
|
+
def associations
|
28
|
+
self.relations
|
29
|
+
end
|
30
|
+
|
31
|
+
module ClassMethods
|
32
|
+
|
33
|
+
# Adds the relation back to the parent document. This macro is
|
34
|
+
# necessary to set the references from the child back to the parent
|
35
|
+
# document. If a child does not define this relation calling
|
36
|
+
# persistence methods on the child object will cause a save to fail.
|
37
|
+
#
|
38
|
+
# @example Define the relation.
|
39
|
+
#
|
40
|
+
# class Person
|
41
|
+
# include Mongoid::Document
|
42
|
+
# embeds_many :addresses
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# class Address
|
46
|
+
# include Mongoid::Document
|
47
|
+
# embedded_in :person
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# @param [ Symbol ] name The name of the relation.
|
51
|
+
# @param [ Hash ] options The relation options.
|
52
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
53
|
+
def embedded_in(name, options = {}, &block)
|
54
|
+
meta = characterize(name, Embedded::In, options, &block)
|
55
|
+
self.embedded = true
|
56
|
+
relate(name, meta)
|
57
|
+
builder(name, meta).creator(name, meta)
|
58
|
+
add_counter_cache_callbacks(meta) if meta.counter_cached?
|
59
|
+
meta
|
60
|
+
end
|
61
|
+
|
62
|
+
# Adds the relation from a parent document to its children. The name
|
63
|
+
# of the relation needs to be a pluralized form of the child class
|
64
|
+
# name.
|
65
|
+
#
|
66
|
+
# @example Define the relation.
|
67
|
+
#
|
68
|
+
# class Person
|
69
|
+
# include Mongoid::Document
|
70
|
+
# embeds_many :addresses
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# class Address
|
74
|
+
# include Mongoid::Document
|
75
|
+
# embedded_in :person
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# @param [ Symbol ] name The name of the relation.
|
79
|
+
# @param [ Hash ] options The relation options.
|
80
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
81
|
+
def embeds_many(name, options = {}, &block)
|
82
|
+
meta = characterize(name, Embedded::Many, options, &block)
|
83
|
+
self.cyclic = true if options[:cyclic]
|
84
|
+
relate(name, meta)
|
85
|
+
embed(name, meta)
|
86
|
+
validates_relation(meta)
|
87
|
+
meta
|
88
|
+
end
|
89
|
+
|
90
|
+
# Adds the relation from a parent document to its child. The name
|
91
|
+
# of the relation needs to be a singular form of the child class
|
92
|
+
# name.
|
93
|
+
#
|
94
|
+
# @example Define the relation.
|
95
|
+
#
|
96
|
+
# class Person
|
97
|
+
# include Mongoid::Document
|
98
|
+
# embeds_one :name
|
99
|
+
# end
|
100
|
+
#
|
101
|
+
# class Name
|
102
|
+
# include Mongoid::Document
|
103
|
+
# embedded_in :person
|
104
|
+
# end
|
105
|
+
#
|
106
|
+
# @param [ Symbol ] name The name of the relation.
|
107
|
+
# @param [ Hash ] options The relation options.
|
108
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
109
|
+
def embeds_one(name, options = {}, &block)
|
110
|
+
meta = characterize(name, Embedded::One, options, &block)
|
111
|
+
self.cyclic = true if options[:cyclic]
|
112
|
+
relate(name, meta)
|
113
|
+
embed(name, meta)
|
114
|
+
builder(name, meta).creator(name, meta)
|
115
|
+
validates_relation(meta)
|
116
|
+
meta
|
117
|
+
end
|
118
|
+
|
119
|
+
# Adds a relational association from the child Document to a Document in
|
120
|
+
# another database or collection.
|
121
|
+
#
|
122
|
+
# @example Define the relation.
|
123
|
+
#
|
124
|
+
# class Game
|
125
|
+
# include Mongoid::Document
|
126
|
+
# belongs_to :person
|
127
|
+
# end
|
128
|
+
#
|
129
|
+
# class Person
|
130
|
+
# include Mongoid::Document
|
131
|
+
# has_one :game
|
132
|
+
# end
|
133
|
+
#
|
134
|
+
# @param [ Symbol ] name The name of the relation.
|
135
|
+
# @param [ Hash ] options The relation options.
|
136
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
137
|
+
def belongs_to(name, options = {}, &block)
|
138
|
+
meta = reference_one_to_one(name, options, Referenced::In, &block)
|
139
|
+
aliased_fields[name.to_s] = meta.foreign_key
|
140
|
+
touchable(meta)
|
141
|
+
add_counter_cache_callbacks(meta) if meta.counter_cached?
|
142
|
+
meta
|
143
|
+
end
|
144
|
+
|
145
|
+
# Adds a relational association from a parent Document to many
|
146
|
+
# Documents in another database or collection.
|
147
|
+
#
|
148
|
+
# @example Define the relation.
|
149
|
+
#
|
150
|
+
# class Person
|
151
|
+
# include Mongoid::Document
|
152
|
+
# has_many :posts
|
153
|
+
# end
|
154
|
+
#
|
155
|
+
# class Game
|
156
|
+
# include Mongoid::Document
|
157
|
+
# belongs_to :person
|
158
|
+
# end
|
159
|
+
#
|
160
|
+
# @param [ Symbol ] name The name of the relation.
|
161
|
+
# @param [ Hash ] options The relation options.
|
162
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
163
|
+
def has_many(name, options = {}, &block)
|
164
|
+
meta = characterize(name, Referenced::Many, options, &block)
|
165
|
+
relate(name, meta)
|
166
|
+
ids_getter(name, meta).ids_setter(name, meta)
|
167
|
+
reference(meta)
|
168
|
+
autosave(meta)
|
169
|
+
validates_relation(meta)
|
170
|
+
meta
|
171
|
+
end
|
172
|
+
|
173
|
+
# Adds a relational many-to-many association between many of this
|
174
|
+
# Document and many of another Document.
|
175
|
+
#
|
176
|
+
# @example Define the relation.
|
177
|
+
#
|
178
|
+
# class Person
|
179
|
+
# include Mongoid::Document
|
180
|
+
# has_and_belongs_to_many :preferences
|
181
|
+
# end
|
182
|
+
#
|
183
|
+
# class Preference
|
184
|
+
# include Mongoid::Document
|
185
|
+
# has_and_belongs_to_many :people
|
186
|
+
# end
|
187
|
+
#
|
188
|
+
# @param [ Symbol ] name The name of the relation.
|
189
|
+
# @param [ Hash ] options The relation options.
|
190
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
191
|
+
#
|
192
|
+
# @since 2.0.0.rc.1
|
193
|
+
def has_and_belongs_to_many(name, options = {}, &block)
|
194
|
+
meta = characterize(name, Referenced::ManyToMany, options, &block)
|
195
|
+
relate(name, meta)
|
196
|
+
reference(meta, Array)
|
197
|
+
autosave(meta)
|
198
|
+
validates_relation(meta)
|
199
|
+
synced(meta)
|
200
|
+
meta
|
201
|
+
end
|
202
|
+
|
203
|
+
# Adds a relational association from the child Document to a Document in
|
204
|
+
# another database or collection.
|
205
|
+
#
|
206
|
+
# @example Define the relation.
|
207
|
+
#
|
208
|
+
# class Game
|
209
|
+
# include Mongoid::Document
|
210
|
+
# belongs_to :person
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# class Person
|
214
|
+
# include Mongoid::Document
|
215
|
+
# has_one :game
|
216
|
+
# end
|
217
|
+
#
|
218
|
+
# @param [ Symbol ] name The name of the relation.
|
219
|
+
# @param [ Hash ] options The relation options.
|
220
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
221
|
+
def has_one(name, options = {}, &block)
|
222
|
+
reference_one_to_one(name, options, Referenced::One, &block)
|
223
|
+
end
|
224
|
+
|
225
|
+
private
|
226
|
+
|
227
|
+
# Create the metadata for the relation.
|
228
|
+
#
|
229
|
+
# @api private
|
230
|
+
#
|
231
|
+
# @example Create the metadata.
|
232
|
+
# Person.characterize(:posts, Referenced::Many, {})
|
233
|
+
#
|
234
|
+
# @param [ Symbol ] name The name of the relation.
|
235
|
+
# @param [ Object ] relation The type of relation.
|
236
|
+
# @param [ Hash ] options The relation options.
|
237
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
238
|
+
#
|
239
|
+
# @return [ Metadata ] The metadata for the relation.
|
240
|
+
def characterize(name, relation, options, &block)
|
241
|
+
Metadata.new({
|
242
|
+
relation: relation,
|
243
|
+
extend: create_extension_module(name, &block),
|
244
|
+
inverse_class_name: self.name,
|
245
|
+
name: name
|
246
|
+
}.merge(options))
|
247
|
+
end
|
248
|
+
|
249
|
+
# Generate a named extension module suitable for marshaling
|
250
|
+
#
|
251
|
+
# @api private
|
252
|
+
#
|
253
|
+
# @example Get the module.
|
254
|
+
# Person.create_extension_module(:posts, &block)
|
255
|
+
#
|
256
|
+
# @param [ Symbol ] name The name of the relation.
|
257
|
+
# @param [ Proc ] block Optional block for defining extensions.
|
258
|
+
#
|
259
|
+
# @return [ Module, nil ] The extension or nil.
|
260
|
+
#
|
261
|
+
# @since 2.1.0
|
262
|
+
def create_extension_module(name, &block)
|
263
|
+
if block
|
264
|
+
extension_module_name =
|
265
|
+
"#{self.to_s.demodulize}#{name.to_s.camelize}RelationExtension"
|
266
|
+
silence_warnings do
|
267
|
+
self.const_set(extension_module_name, Module.new(&block))
|
268
|
+
end
|
269
|
+
"#{self}::#{extension_module_name}".constantize
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
# Add an embedded relation metadata to the embedded relations.
|
274
|
+
#
|
275
|
+
# @api private
|
276
|
+
#
|
277
|
+
# @example Add the metadata to embedded relations.
|
278
|
+
# Person.embed("addresses", metadata)
|
279
|
+
#
|
280
|
+
# @param [ String ] name The name of the relation.
|
281
|
+
# @param [ Metadata ] metadata The relation metadata.
|
282
|
+
#
|
283
|
+
# @since 3.0.0
|
284
|
+
def embed(name, metadata)
|
285
|
+
self.embedded_relations = embedded_relations.merge(name.to_s => metadata)
|
286
|
+
aliased_fields[name.to_s] = metadata.store_as if metadata.store_as
|
287
|
+
end
|
288
|
+
|
289
|
+
# Defines a field to be used as a foreign key in the relation and
|
290
|
+
# indexes it if defined.
|
291
|
+
#
|
292
|
+
# @api private
|
293
|
+
#
|
294
|
+
# @example Set up the relational fields and indexes.
|
295
|
+
# Person.reference(metadata)
|
296
|
+
#
|
297
|
+
# @param [ Metadata ] metadata The metadata for the relation.
|
298
|
+
def reference(metadata, type = Object)
|
299
|
+
polymorph(metadata).cascade(metadata)
|
300
|
+
if metadata.relation.stores_foreign_key?
|
301
|
+
key = metadata.foreign_key
|
302
|
+
field(
|
303
|
+
key,
|
304
|
+
type: type,
|
305
|
+
identity: true,
|
306
|
+
metadata: metadata,
|
307
|
+
default: metadata.foreign_key_default
|
308
|
+
)
|
309
|
+
if metadata.indexed?
|
310
|
+
if metadata.polymorphic?
|
311
|
+
index({ key => 1, metadata.type => 1 }, { background: true })
|
312
|
+
else
|
313
|
+
index({ key => 1 }, { background: true })
|
314
|
+
end
|
315
|
+
end
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
# Handle common behaviour for referenced 1-1 relation setup.
|
320
|
+
#
|
321
|
+
# @api private
|
322
|
+
#
|
323
|
+
# @example Add the one to one behaviour.
|
324
|
+
# Model.reference_one_to_one(:name, meta)
|
325
|
+
#
|
326
|
+
# @param [ Symbol ] name The name of the relation.
|
327
|
+
# @param [ Metadata ] meta The relation metadata.
|
328
|
+
#
|
329
|
+
# @return [ Class ] The model class.
|
330
|
+
#
|
331
|
+
# @since 3.0.0
|
332
|
+
def reference_one_to_one(name, options, relation, &block)
|
333
|
+
meta = characterize(name, relation, options, &block)
|
334
|
+
relate(name, meta)
|
335
|
+
reference(meta)
|
336
|
+
builder(name, meta).creator(name, meta).autosave(meta)
|
337
|
+
validates_relation(meta)
|
338
|
+
meta
|
339
|
+
end
|
340
|
+
|
341
|
+
# Creates a relation for the given name, metadata and relation. It adds
|
342
|
+
# the metadata to the relations hash and has the accessors set up.
|
343
|
+
#
|
344
|
+
# @example Set up the relation and accessors.
|
345
|
+
# Person.relate(:addresses, Metadata)
|
346
|
+
#
|
347
|
+
# @param [ Symbol ] name The name of the relation.
|
348
|
+
# @param [ Metadata ] metadata The metadata for the relation.
|
349
|
+
def relate(name, metadata)
|
350
|
+
self.relations = relations.merge(name.to_s => metadata)
|
351
|
+
getter(name, metadata).setter(name, metadata).existence_check(name, metadata)
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
end
|
356
|
+
end
|