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,290 @@
|
|
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
|
+
# one-to-one between documents in different collections.
|
8
|
+
class One < Relations::One
|
9
|
+
|
10
|
+
# Instantiate a new references_one relation. Will set the foreign key
|
11
|
+
# and the base on the inverse object.
|
12
|
+
#
|
13
|
+
# @example Create the new relation.
|
14
|
+
# Referenced::One.new(base, target, metadata)
|
15
|
+
#
|
16
|
+
# @param [ Document ] base The document this relation hangs off of.
|
17
|
+
# @param [ Document ] target The target (child) of the relation.
|
18
|
+
# @param [ Metadata ] metadata The relation's metadata.
|
19
|
+
def initialize(base, target, metadata)
|
20
|
+
init(base, target, metadata) do
|
21
|
+
raise_mixed if klass.embedded? && !klass.cyclic?
|
22
|
+
characterize_one(target)
|
23
|
+
bind_one
|
24
|
+
target.save if persistable?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Removes the association between the base document and the target
|
29
|
+
# document by deleting the foreign key and the reference, orphaning
|
30
|
+
# the target document in the process.
|
31
|
+
#
|
32
|
+
# @example Nullify the relation.
|
33
|
+
# person.game.nullify
|
34
|
+
#
|
35
|
+
# @since 2.0.0.rc.1
|
36
|
+
def nullify
|
37
|
+
unbind_one
|
38
|
+
target.save
|
39
|
+
end
|
40
|
+
|
41
|
+
# Substitutes the supplied target document for the existing document
|
42
|
+
# in the relation. If the new target is nil, perform the necessary
|
43
|
+
# deletion.
|
44
|
+
#
|
45
|
+
# @example Replace the relation.
|
46
|
+
# person.game.substitute(new_game)
|
47
|
+
#
|
48
|
+
# @param [ Array<Document> ] replacement The replacement target.
|
49
|
+
#
|
50
|
+
# @return [ One ] The relation.
|
51
|
+
#
|
52
|
+
# @since 2.0.0.rc.1
|
53
|
+
def substitute(replacement)
|
54
|
+
unbind_one
|
55
|
+
if persistable?
|
56
|
+
if metadata.destructive?
|
57
|
+
send(metadata.dependent)
|
58
|
+
else
|
59
|
+
save if persisted?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
One.new(base, replacement, metadata) if replacement
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
# Instantiate the binding associated with this relation.
|
68
|
+
#
|
69
|
+
# @example Get the binding.
|
70
|
+
# relation.binding([ address ])
|
71
|
+
#
|
72
|
+
# @param [ Document ] new_target The new target of the relation.
|
73
|
+
#
|
74
|
+
# @return [ Binding ] The binding object.
|
75
|
+
def binding
|
76
|
+
Bindings::Referenced::One.new(base, target, metadata)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Are we able to persist this relation?
|
80
|
+
#
|
81
|
+
# @example Can we persist the relation?
|
82
|
+
# relation.persistable?
|
83
|
+
#
|
84
|
+
# @return [ true, false ] If the relation is persistable.
|
85
|
+
#
|
86
|
+
# @since 2.1.0
|
87
|
+
def persistable?
|
88
|
+
base.persisted? && !_binding? && !_building?
|
89
|
+
end
|
90
|
+
|
91
|
+
class << self
|
92
|
+
|
93
|
+
# Return the builder that is responsible for generating the documents
|
94
|
+
# that will be used by this relation.
|
95
|
+
#
|
96
|
+
# @example Get the builder.
|
97
|
+
# Referenced::One.builder(meta, object)
|
98
|
+
#
|
99
|
+
# @param [ Document ] base The base document.
|
100
|
+
# @param [ Metadata ] meta The metadata of the relation.
|
101
|
+
# @param [ Document, Hash ] object A document or attributes to build
|
102
|
+
# with.
|
103
|
+
#
|
104
|
+
# @return [ Builder ] A new builder object.
|
105
|
+
#
|
106
|
+
# @since 2.0.0.rc.1
|
107
|
+
def builder(base, meta, object)
|
108
|
+
Builders::Referenced::One.new(base, meta, object)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Get the standard criteria used for querying this relation.
|
112
|
+
#
|
113
|
+
# @example Get the criteria.
|
114
|
+
# Proxy.criteria(meta, id, Model)
|
115
|
+
#
|
116
|
+
# @param [ Metadata ] metadata The metadata.
|
117
|
+
# @param [ Object ] object The value of the foreign key.
|
118
|
+
# @param [ Class ] type The optional type.
|
119
|
+
#
|
120
|
+
# @return [ Criteria ] The criteria.
|
121
|
+
#
|
122
|
+
# @since 2.1.0
|
123
|
+
def criteria(metadata, object, type = nil)
|
124
|
+
crit = metadata.klass.where(metadata.foreign_key => object)
|
125
|
+
if metadata.polymorphic?
|
126
|
+
crit = crit.where(metadata.type => type.name)
|
127
|
+
end
|
128
|
+
crit
|
129
|
+
end
|
130
|
+
|
131
|
+
# Get the criteria that is used to eager load a relation of this
|
132
|
+
# type.
|
133
|
+
#
|
134
|
+
# @example Get the eager load criteria.
|
135
|
+
# Proxy.eager_load(metadata, criteria)
|
136
|
+
#
|
137
|
+
# @param [ Metadata ] metadata The relation metadata.
|
138
|
+
# @param [ Array<Object> ] ids The ids of the base docs.
|
139
|
+
#
|
140
|
+
# @return [ Criteria ] The criteria to eager load the relation.
|
141
|
+
#
|
142
|
+
# @since 2.2.0
|
143
|
+
def eager_load(metadata, ids)
|
144
|
+
eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_one(doc, key) }
|
145
|
+
end
|
146
|
+
|
147
|
+
# Returns true if the relation is an embedded one. In this case
|
148
|
+
# always false.
|
149
|
+
#
|
150
|
+
# @example Is this relation embedded?
|
151
|
+
# Referenced::One.embedded?
|
152
|
+
#
|
153
|
+
# @return [ false ] Always false.
|
154
|
+
#
|
155
|
+
# @since 2.0.0.rc.1
|
156
|
+
def embedded?
|
157
|
+
false
|
158
|
+
end
|
159
|
+
|
160
|
+
# Get the foreign key for the provided name.
|
161
|
+
#
|
162
|
+
# @example Get the foreign key.
|
163
|
+
# Referenced::One.foreign_key(:person)
|
164
|
+
#
|
165
|
+
# @param [ Symbol ] name The name.
|
166
|
+
#
|
167
|
+
# @return [ String ] The foreign key.
|
168
|
+
#
|
169
|
+
# @since 3.0.0
|
170
|
+
def foreign_key(name)
|
171
|
+
"#{name}#{foreign_key_suffix}"
|
172
|
+
end
|
173
|
+
|
174
|
+
# Get the default value for the foreign key.
|
175
|
+
#
|
176
|
+
# @example Get the default.
|
177
|
+
# Referenced::One.foreign_key_default
|
178
|
+
#
|
179
|
+
# @return [ nil ] Always nil.
|
180
|
+
#
|
181
|
+
# @since 2.0.0.rc.1
|
182
|
+
def foreign_key_default
|
183
|
+
nil
|
184
|
+
end
|
185
|
+
|
186
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
187
|
+
#
|
188
|
+
# @example Get the suffix for the foreign key.
|
189
|
+
# Referenced::One.foreign_key_suffix
|
190
|
+
#
|
191
|
+
# @return [ String ] "_id"
|
192
|
+
#
|
193
|
+
# @since 2.0.0.rc.1
|
194
|
+
def foreign_key_suffix
|
195
|
+
"_id"
|
196
|
+
end
|
197
|
+
|
198
|
+
# Returns the macro for this relation. Used mostly as a helper in
|
199
|
+
# reflection.
|
200
|
+
#
|
201
|
+
# @example Get the macro.
|
202
|
+
# Referenced::One.macro
|
203
|
+
#
|
204
|
+
# @return [ Symbol ] :has_one.
|
205
|
+
def macro
|
206
|
+
:has_one
|
207
|
+
end
|
208
|
+
|
209
|
+
# Return the nested builder that is responsible for generating the documents
|
210
|
+
# that will be used by this relation.
|
211
|
+
#
|
212
|
+
# @example Get the nested builder.
|
213
|
+
# Referenced::One.builder(attributes, options)
|
214
|
+
#
|
215
|
+
# @param [ Metadata ] metadata The relation metadata.
|
216
|
+
# @param [ Hash ] attributes The attributes to build with.
|
217
|
+
# @param [ Hash ] options The options for the builder.
|
218
|
+
#
|
219
|
+
# @option options [ true, false ] :allow_destroy Can documents be
|
220
|
+
# deleted?
|
221
|
+
# @option options [ Integer ] :limit Max number of documents to
|
222
|
+
# create at once.
|
223
|
+
# @option options [ Proc, Symbol ] :reject_if If documents match this
|
224
|
+
# option then they are ignored.
|
225
|
+
# @option options [ true, false ] :update_only Only existing documents
|
226
|
+
# can be modified.
|
227
|
+
#
|
228
|
+
# @return [ NestedBuilder ] A newly instantiated nested builder object.
|
229
|
+
#
|
230
|
+
# @since 2.0.0.rc.1
|
231
|
+
def nested_builder(metadata, attributes, options)
|
232
|
+
Builders::NestedAttributes::One.new(metadata, attributes, options)
|
233
|
+
end
|
234
|
+
|
235
|
+
# Get the path calculator for the supplied document.
|
236
|
+
#
|
237
|
+
# @example Get the path calculator.
|
238
|
+
# Proxy.path(document)
|
239
|
+
#
|
240
|
+
# @param [ Document ] document The document to calculate on.
|
241
|
+
#
|
242
|
+
# @return [ Root ] The root atomic path calculator.
|
243
|
+
#
|
244
|
+
# @since 2.1.0
|
245
|
+
def path(document)
|
246
|
+
Mongoid::Atomic::Paths::Root.new(document)
|
247
|
+
end
|
248
|
+
|
249
|
+
# Tells the caller if this relation is one that stores the foreign
|
250
|
+
# key on its own objects.
|
251
|
+
#
|
252
|
+
# @example Does this relation store a foreign key?
|
253
|
+
# Referenced::One.stores_foreign_key?
|
254
|
+
#
|
255
|
+
# @return [ false ] Always false.
|
256
|
+
#
|
257
|
+
# @since 2.0.0.rc.1
|
258
|
+
def stores_foreign_key?
|
259
|
+
false
|
260
|
+
end
|
261
|
+
|
262
|
+
# Get the valid options allowed with this relation.
|
263
|
+
#
|
264
|
+
# @example Get the valid options.
|
265
|
+
# Relation.valid_options
|
266
|
+
#
|
267
|
+
# @return [ Array<Symbol> ] The valid options.
|
268
|
+
#
|
269
|
+
# @since 2.1.0
|
270
|
+
def valid_options
|
271
|
+
[ :as, :autobuild, :autosave, :dependent, :foreign_key, :primary_key ]
|
272
|
+
end
|
273
|
+
|
274
|
+
# Get the default validation setting for the relation. Determines if
|
275
|
+
# by default a validates associated will occur.
|
276
|
+
#
|
277
|
+
# @example Get the validation default.
|
278
|
+
# Proxy.validation_default
|
279
|
+
#
|
280
|
+
# @return [ true, false ] The validation default.
|
281
|
+
#
|
282
|
+
# @since 2.1.9
|
283
|
+
def validation_default
|
284
|
+
true
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
|
5
|
+
# The reflections module provides convenience methods that can retrieve
|
6
|
+
# useful information about associations.
|
7
|
+
module Reflections
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
# Returns the relation metadata for the supplied name.
|
11
|
+
#
|
12
|
+
# @example Find relation metadata by name.
|
13
|
+
# person.reflect_on_association(:addresses)
|
14
|
+
#
|
15
|
+
# @param [ String, Symbol ] name The name of the relation to find.
|
16
|
+
#
|
17
|
+
# @return [ Metadata ] The matching relation metadata.
|
18
|
+
def reflect_on_association(name)
|
19
|
+
self.class.reflect_on_association(name)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns all relation metadata for the supplied macros.
|
23
|
+
#
|
24
|
+
# @example Find multiple relation metadata by macro.
|
25
|
+
# person.reflect_on_all_associations(:embeds_many)
|
26
|
+
#
|
27
|
+
# @param [ Array<String, Symbol> ] *macros The relation macros.
|
28
|
+
#
|
29
|
+
# @return [ Array<Metadata> ] The matching relation metadata.
|
30
|
+
def reflect_on_all_associations(*macros)
|
31
|
+
self.class.reflect_on_all_associations(*macros)
|
32
|
+
end
|
33
|
+
|
34
|
+
module ClassMethods
|
35
|
+
|
36
|
+
# Returns the relation metadata for the supplied name.
|
37
|
+
#
|
38
|
+
# @example Find relation metadata by name.
|
39
|
+
# Person.reflect_on_association(:addresses)
|
40
|
+
#
|
41
|
+
# @param [ String, Symbol ] name The name of the relation to find.
|
42
|
+
#
|
43
|
+
# @return [ Metadata ] The matching relation metadata.
|
44
|
+
def reflect_on_association(name)
|
45
|
+
relations[name.to_s]
|
46
|
+
end
|
47
|
+
|
48
|
+
# Returns all relation metadata for the supplied macros.
|
49
|
+
#
|
50
|
+
# @example Find multiple relation metadata by macro.
|
51
|
+
# Person.reflect_on_all_associations(:embeds_many)
|
52
|
+
#
|
53
|
+
# @param [ Array<String, Symbol> ] *macros The relation macros.
|
54
|
+
#
|
55
|
+
# @return [ Array<Metadata> ] The matching relation metadata.
|
56
|
+
def reflect_on_all_associations(*macros)
|
57
|
+
relations.values.select { |meta| macros.include?(meta.macro) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
|
5
|
+
# This module handles the behaviour for synchronizing foreign keys between
|
6
|
+
# both sides of a many to many relations.
|
7
|
+
module Synchronization
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
# Is the document able to be synced on the inverse side? This is only if
|
11
|
+
# the key has changed and the relation bindings have not been run.
|
12
|
+
#
|
13
|
+
# @example Are the foreign keys syncable?
|
14
|
+
# document.syncable?(metadata)
|
15
|
+
#
|
16
|
+
# @param [ Metadata ] metadata The relation metadata.
|
17
|
+
#
|
18
|
+
# @return [ true, false ] If we can sync.
|
19
|
+
#
|
20
|
+
# @since 2.1.0
|
21
|
+
def syncable?(metadata)
|
22
|
+
!synced?(metadata.foreign_key) && send(metadata.foreign_key_check)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Get the synced foreign keys.
|
26
|
+
#
|
27
|
+
# @example Get the synced foreign keys.
|
28
|
+
# document.synced
|
29
|
+
#
|
30
|
+
# @return [ Hash ] The synced foreign keys.
|
31
|
+
#
|
32
|
+
# @since 2.1.0
|
33
|
+
def synced
|
34
|
+
@synced ||= {}
|
35
|
+
end
|
36
|
+
|
37
|
+
# Has the document been synced for the foreign key?
|
38
|
+
#
|
39
|
+
# @example Has the document been synced?
|
40
|
+
# document.synced?
|
41
|
+
#
|
42
|
+
# @param [ String ] foreign_key The foreign key.
|
43
|
+
#
|
44
|
+
# @return [ true, false ] If we can sync.
|
45
|
+
#
|
46
|
+
# @since 2.1.0
|
47
|
+
def synced?(foreign_key)
|
48
|
+
!!synced[foreign_key]
|
49
|
+
end
|
50
|
+
|
51
|
+
# Update the inverse keys on destroy.
|
52
|
+
#
|
53
|
+
# @example Update the inverse keys.
|
54
|
+
# document.remove_inverse_keys(metadata)
|
55
|
+
#
|
56
|
+
# @param [ Metadata ] meta The document metadata.
|
57
|
+
#
|
58
|
+
# @return [ Object ] The updated values.
|
59
|
+
#
|
60
|
+
# @since 2.2.1
|
61
|
+
def remove_inverse_keys(meta)
|
62
|
+
foreign_keys = send(meta.foreign_key)
|
63
|
+
unless foreign_keys.nil? || foreign_keys.empty?
|
64
|
+
meta.criteria(foreign_keys, self.class).pull(meta.inverse_foreign_key => id)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Update the inverse keys for the relation.
|
69
|
+
#
|
70
|
+
# @example Update the inverse keys
|
71
|
+
# document.update_inverse_keys(metadata)
|
72
|
+
#
|
73
|
+
# @param [ Metadata ] meta The document metadata.
|
74
|
+
#
|
75
|
+
# @return [ Object ] The updated values.
|
76
|
+
#
|
77
|
+
# @since 2.1.0
|
78
|
+
def update_inverse_keys(meta)
|
79
|
+
if changes.has_key?(meta.foreign_key)
|
80
|
+
old, new = changes[meta.foreign_key]
|
81
|
+
adds, subs = new - (old || []), (old || []) - new
|
82
|
+
|
83
|
+
# If we are autosaving we don't want a duplicate to get added - the
|
84
|
+
# $addToSet would run previously and then the $pushAll from the
|
85
|
+
# inverse on the autosave would cause this. We delete each id from
|
86
|
+
# what's in memory in case a mix of id addition and object addition
|
87
|
+
# had occurred.
|
88
|
+
if meta.autosave?
|
89
|
+
send(meta.name).in_memory.each do |doc|
|
90
|
+
adds.delete_one(doc.id)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
unless adds.empty?
|
95
|
+
meta.criteria(adds, self.class).without_options.add_to_set(meta.inverse_foreign_key => id)
|
96
|
+
end
|
97
|
+
unless subs.empty?
|
98
|
+
meta.criteria(subs, self.class).without_options.pull(meta.inverse_foreign_key => id)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
module ClassMethods
|
104
|
+
|
105
|
+
# Set up the syncing of many to many foreign keys.
|
106
|
+
#
|
107
|
+
# @example Set up the syncing.
|
108
|
+
# Person.synced(metadata)
|
109
|
+
#
|
110
|
+
# @param [ Metadata ] metadata The relation metadata.
|
111
|
+
#
|
112
|
+
# @since 2.1.0
|
113
|
+
def synced(metadata)
|
114
|
+
unless metadata.forced_nil_inverse?
|
115
|
+
synced_save(metadata)
|
116
|
+
synced_destroy(metadata)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
# Set up the sync of inverse keys that needs to happen on a save.
|
123
|
+
#
|
124
|
+
# If the foreign key field has changed and the document is not
|
125
|
+
# synced, $addToSet the new ids, $pull the ones no longer in the
|
126
|
+
# array from the inverse side.
|
127
|
+
#
|
128
|
+
# @example Set up the save syncing.
|
129
|
+
# Person.synced_save(metadata)
|
130
|
+
#
|
131
|
+
# @param [ Metadata ] metadata The relation metadata.
|
132
|
+
#
|
133
|
+
# @return [ Class ] The class getting set up.
|
134
|
+
#
|
135
|
+
# @since 2.1.0
|
136
|
+
def synced_save(metadata)
|
137
|
+
set_callback(
|
138
|
+
:save,
|
139
|
+
:after,
|
140
|
+
if: ->(doc){ doc.syncable?(metadata) }
|
141
|
+
) do |doc|
|
142
|
+
doc.update_inverse_keys(metadata)
|
143
|
+
end
|
144
|
+
self
|
145
|
+
end
|
146
|
+
|
147
|
+
# Set up the sync of inverse keys that needs to happen on a destroy.
|
148
|
+
#
|
149
|
+
# @example Set up the destroy syncing.
|
150
|
+
# Person.synced_destroy(metadata)
|
151
|
+
#
|
152
|
+
# @param [ Metadata ] metadata The relation metadata.
|
153
|
+
#
|
154
|
+
# @return [ Class ] The class getting set up.
|
155
|
+
#
|
156
|
+
# @since 2.2.1
|
157
|
+
def synced_destroy(metadata)
|
158
|
+
set_callback(
|
159
|
+
:destroy,
|
160
|
+
:after
|
161
|
+
) do |doc|
|
162
|
+
doc.remove_inverse_keys(metadata)
|
163
|
+
end
|
164
|
+
self
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|