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,92 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Fields
|
4
|
+
module Validators
|
5
|
+
|
6
|
+
# Validates the params passed to the field macro.
|
7
|
+
module Macro
|
8
|
+
extend self
|
9
|
+
|
10
|
+
OPTIONS = [
|
11
|
+
:as,
|
12
|
+
:default,
|
13
|
+
:identity,
|
14
|
+
:label,
|
15
|
+
:localize,
|
16
|
+
:metadata,
|
17
|
+
:pre_processed,
|
18
|
+
:subtype,
|
19
|
+
:type,
|
20
|
+
:overwrite
|
21
|
+
]
|
22
|
+
|
23
|
+
# Validate the field definition.
|
24
|
+
#
|
25
|
+
# @example Validate the field definition.
|
26
|
+
# Macro.validate(Model, :name, { localized: true })
|
27
|
+
#
|
28
|
+
# @param [ Class ] klass The model class.
|
29
|
+
# @param [ Symbol ] name The field name.
|
30
|
+
# @param [ Hash ] options The provided options.
|
31
|
+
#
|
32
|
+
# @since 3.0.0
|
33
|
+
def validate(klass, name, options)
|
34
|
+
validate_name(klass, name, options)
|
35
|
+
validate_options(klass, name, options)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Determine if the field name is allowed, if not raise an error.
|
41
|
+
#
|
42
|
+
# @api private
|
43
|
+
#
|
44
|
+
# @example Check the field name.
|
45
|
+
# Macro.validate_name(Model, :name)
|
46
|
+
#
|
47
|
+
# @param [ Class ] klass The model class.
|
48
|
+
# @param [ Symbol ] name The field name.
|
49
|
+
#
|
50
|
+
# @raise [ Errors::InvalidField ] If the name is not allowed.
|
51
|
+
#
|
52
|
+
# @since 3.0.0
|
53
|
+
def validate_name(klass, name, options)
|
54
|
+
if Mongoid.destructive_fields.include?(name)
|
55
|
+
raise Errors::InvalidField.new(klass, name)
|
56
|
+
end
|
57
|
+
|
58
|
+
# if field alredy defined
|
59
|
+
if !options[:overwrite] && klass.fields.keys.include?(name.to_s)
|
60
|
+
if Mongoid.duplicate_fields_exception
|
61
|
+
raise Errors::InvalidField.new(klass, name)
|
62
|
+
else
|
63
|
+
Mongoid.logger.warn("Overwriting existing field #{name}.") if Mongoid.logger
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Validate that the field options are allowed.
|
69
|
+
#
|
70
|
+
# @api private
|
71
|
+
#
|
72
|
+
# @example Validate the field options.
|
73
|
+
# Macro.validate_options(Model, :name, { localized: true })
|
74
|
+
#
|
75
|
+
# @param [ Class ] klass The model class.
|
76
|
+
# @param [ Symbol ] name The field name.
|
77
|
+
# @param [ Hash ] options The provided options.
|
78
|
+
#
|
79
|
+
# @raise [ Errors::InvalidFieldOption ] If an option is invalid.
|
80
|
+
#
|
81
|
+
# @since 3.0.0
|
82
|
+
def validate_options(klass, name, options)
|
83
|
+
options.keys.each do |option|
|
84
|
+
if !OPTIONS.include?(option) && !Fields.options.include?(option)
|
85
|
+
raise Errors::InvalidFieldOption.new(klass, name, option, OPTIONS)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module defines the finder methods that hang off the document at the
|
5
|
+
# class level.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Findable
|
9
|
+
extend Origin::Forwardable
|
10
|
+
|
11
|
+
select_with :with_default_scope
|
12
|
+
|
13
|
+
# These are methods defined on the criteria that should also be accessible
|
14
|
+
# directly from the the class level.
|
15
|
+
delegate \
|
16
|
+
:aggregates,
|
17
|
+
:avg,
|
18
|
+
:distinct,
|
19
|
+
:each,
|
20
|
+
:each_with_index,
|
21
|
+
:extras,
|
22
|
+
:find_and_modify,
|
23
|
+
:find_or_create_by,
|
24
|
+
:find_or_initialize_by,
|
25
|
+
:first_or_create,
|
26
|
+
:first_or_create!,
|
27
|
+
:first_or_initialize,
|
28
|
+
:for_js,
|
29
|
+
:geo_near,
|
30
|
+
:includes,
|
31
|
+
:map_reduce,
|
32
|
+
:max,
|
33
|
+
:min,
|
34
|
+
:pluck,
|
35
|
+
:sum,
|
36
|
+
:text_search,
|
37
|
+
:update,
|
38
|
+
:update_all, to: :with_default_scope
|
39
|
+
|
40
|
+
# Returns a count of records in the database.
|
41
|
+
# If you want to specify conditions use where.
|
42
|
+
#
|
43
|
+
# @example Get the count of matching documents.
|
44
|
+
# Person.count
|
45
|
+
# Person.where(title: "Sir").count
|
46
|
+
#
|
47
|
+
# @return [ Integer ] The number of matching documents.
|
48
|
+
def count
|
49
|
+
with_default_scope.count
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns true if count is zero
|
53
|
+
#
|
54
|
+
# @example Are there no saved documents for this model?
|
55
|
+
# Person.empty?
|
56
|
+
#
|
57
|
+
# @return [ true, false ] If the collection is empty.
|
58
|
+
def empty?
|
59
|
+
count == 0
|
60
|
+
end
|
61
|
+
|
62
|
+
# Returns true if there are on document in database based on the
|
63
|
+
# provided arguments.
|
64
|
+
#
|
65
|
+
# @example Do any documents exist for the conditions?
|
66
|
+
# Person.exists?
|
67
|
+
#
|
68
|
+
# @param [ Array ] args The conditions.
|
69
|
+
def exists?
|
70
|
+
with_default_scope.exists?
|
71
|
+
end
|
72
|
+
|
73
|
+
# Find a +Document+ in several different ways.
|
74
|
+
#
|
75
|
+
# If a +String+ is provided, it will be assumed that it is a
|
76
|
+
# representation of a Mongo::ObjectID and will attempt to find a single
|
77
|
+
# +Document+ based on that id. If a +Symbol+ and +Hash+ is provided then
|
78
|
+
# it will attempt to find either a single +Document+ or multiples based
|
79
|
+
# on the conditions provided and the first parameter.
|
80
|
+
#
|
81
|
+
# @example Find a single document by an id.
|
82
|
+
# Person.find(Moped::BSON::ObjectId)
|
83
|
+
#
|
84
|
+
# @param [ Array ] args An assortment of finder options.
|
85
|
+
#
|
86
|
+
# @return [ Document, nil, Criteria ] A document or matching documents.
|
87
|
+
def find(*args)
|
88
|
+
with_default_scope.find(*args)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Find the first +Document+ given the conditions, or raises
|
92
|
+
# Mongoid::Errors::DocumentNotFound
|
93
|
+
#
|
94
|
+
# @example Find the document by attribute other than id
|
95
|
+
# Person.find_by(:username => "superuser")
|
96
|
+
#
|
97
|
+
# @param [ Hash ] attrs The attributes to check.
|
98
|
+
#
|
99
|
+
# @raise [ Errors::DocumentNotFound ] If no document found.
|
100
|
+
#
|
101
|
+
# @return [ Document ] A matching document.
|
102
|
+
#
|
103
|
+
# @since 3.0.0
|
104
|
+
def find_by(attrs = {})
|
105
|
+
result = where(attrs).first
|
106
|
+
if result.nil? && Mongoid.raise_not_found_error
|
107
|
+
raise(Errors::DocumentNotFound.new(self, attrs))
|
108
|
+
end
|
109
|
+
yield(result) if result && block_given?
|
110
|
+
result
|
111
|
+
end
|
112
|
+
|
113
|
+
# Find the first +Document+ given the conditions.
|
114
|
+
#
|
115
|
+
# @example Find the first document.
|
116
|
+
# Person.first
|
117
|
+
#
|
118
|
+
# @return [ Document ] The first matching document.
|
119
|
+
def first
|
120
|
+
with_default_scope.first
|
121
|
+
end
|
122
|
+
|
123
|
+
# Find the last +Document+ given the conditions.
|
124
|
+
#
|
125
|
+
# @example Find the last document.
|
126
|
+
# Person.last
|
127
|
+
#
|
128
|
+
# @return [ Document ] The last matching document.
|
129
|
+
def last
|
130
|
+
with_default_scope.last
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# Defines behaviour for the identity map in Mongoid.
|
5
|
+
class IdentityMap < Hash
|
6
|
+
|
7
|
+
# Clear out the loaded documents for the provided selector.
|
8
|
+
#
|
9
|
+
# @example Clear out the documents.
|
10
|
+
# map.clear_many(Post, { person_id: person.id })
|
11
|
+
#
|
12
|
+
# @param [ Class ] klass The class of the relation.
|
13
|
+
# @param [ Hash ] selector The selector.
|
14
|
+
#
|
15
|
+
# @return [ Array ] An empty array.
|
16
|
+
#
|
17
|
+
# @since 2.4.10
|
18
|
+
def clear_many(klass, selector)
|
19
|
+
documents_for(klass)[selector] = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
# Get a document from the identity map by its id.
|
23
|
+
#
|
24
|
+
# @example Get the document from the map.
|
25
|
+
# map.get(Person, id)
|
26
|
+
#
|
27
|
+
# @param [ Class ] klass The class of the document.
|
28
|
+
# @param [ Object, Hash ] idenfier The document id or selector.
|
29
|
+
#
|
30
|
+
# @return [ Document ] The matching document.
|
31
|
+
#
|
32
|
+
# @since 2.1.0
|
33
|
+
def get(klass, identifier)
|
34
|
+
if Mongoid.using_identity_map? && klass
|
35
|
+
if identifier.is_a?(::Array)
|
36
|
+
documents = documents_for(klass)
|
37
|
+
identifier.map do |id|
|
38
|
+
documents[id] || (return nil)
|
39
|
+
end
|
40
|
+
else
|
41
|
+
documents_for(klass)[identifier]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Get many documents from the map via the selector
|
47
|
+
#
|
48
|
+
# @example Get the document from the map.
|
49
|
+
# map.get(Person, { post_id: post })
|
50
|
+
#
|
51
|
+
# @param [ Class ] klass The class of the document.
|
52
|
+
# @param [ Hash ] idenfier The selector.
|
53
|
+
#
|
54
|
+
# @return [ Array<Document> ] The matching documents.
|
55
|
+
#
|
56
|
+
# @since 3.0.0
|
57
|
+
def get_many(klass, identifier)
|
58
|
+
if Mongoid.using_identity_map? && klass
|
59
|
+
documents_for(klass)[identifier].try(:values)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Remove the document from the identity map.
|
64
|
+
#
|
65
|
+
# @example Remove the document.
|
66
|
+
# map.removed(person)
|
67
|
+
#
|
68
|
+
# @param [ Document ] document The document to remove.
|
69
|
+
#
|
70
|
+
# @return [ Document, nil ] The removed document.
|
71
|
+
#
|
72
|
+
# @since 2.1.0
|
73
|
+
def remove(document)
|
74
|
+
if Mongoid.using_identity_map? && document && document.id
|
75
|
+
documents_for(document.class).delete(document.id)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Puts a document in the identity map, accessed by its id.
|
80
|
+
#
|
81
|
+
# @example Put the document in the map.
|
82
|
+
# identity_map.set(document)
|
83
|
+
#
|
84
|
+
# @param [ Document ] document The document to place in the map.
|
85
|
+
#
|
86
|
+
# @return [ Document ] The provided document.
|
87
|
+
#
|
88
|
+
# @since 2.1.0
|
89
|
+
def set(document)
|
90
|
+
if Mongoid.using_identity_map? && document && document.id
|
91
|
+
documents_for(document.class)[document.id] = document
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# Set a document in the identity map for the provided selector.
|
96
|
+
#
|
97
|
+
# @example Set the document in the map.
|
98
|
+
# identity_map.set_selector(document, { :person_id => person.id })
|
99
|
+
#
|
100
|
+
# @param [ Document ] document The document to set.
|
101
|
+
# @param [ Hash ] selector The selector to identify it.
|
102
|
+
#
|
103
|
+
# @return [ Array<Document> ] The documents.
|
104
|
+
#
|
105
|
+
# @since 2.2.0
|
106
|
+
def set_many(document, selector)
|
107
|
+
(documents_for(document.class)[selector] ||= {})[document.id] = document
|
108
|
+
end
|
109
|
+
|
110
|
+
# Set a document in the identity map for the provided selector.
|
111
|
+
#
|
112
|
+
# @example Set the document in the map.
|
113
|
+
# identity_map.set_selector(document, { :person_id => person.id })
|
114
|
+
#
|
115
|
+
# @param [ Document ] document The document to set.
|
116
|
+
# @param [ Hash ] selector The selector to identify it.
|
117
|
+
#
|
118
|
+
# @return [ Document ] The matching document.
|
119
|
+
#
|
120
|
+
# @since 2.2.0
|
121
|
+
def set_one(document, selector)
|
122
|
+
documents_for(document.class)[selector] = document
|
123
|
+
end
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
# Get the documents in the identity map for a specific class.
|
128
|
+
#
|
129
|
+
# @example Get the documents for the class.
|
130
|
+
# map.documents_for(Person)
|
131
|
+
#
|
132
|
+
# @param [ Class ] klass The class to retrieve.
|
133
|
+
#
|
134
|
+
# @return [ Hash ] The documents.
|
135
|
+
#
|
136
|
+
# @since 2.1.0
|
137
|
+
def documents_for(klass)
|
138
|
+
if klass
|
139
|
+
self[klass.collection_name] ||= {}
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
class << self
|
144
|
+
|
145
|
+
# For ease of access we provide the same API to the identity map on the
|
146
|
+
# class level, which in turn just gets the identity map that is on the
|
147
|
+
# current thread.
|
148
|
+
#
|
149
|
+
# @example Get a document from the current identity map by id.
|
150
|
+
# IdentityMap.get(id)
|
151
|
+
#
|
152
|
+
# @example Set a document in the current identity map.
|
153
|
+
# IdentityMap.set(document)
|
154
|
+
#
|
155
|
+
# @since 2.1.0
|
156
|
+
delegate(*(
|
157
|
+
Hash.public_instance_methods(false) +
|
158
|
+
IdentityMap.public_instance_methods(false) <<
|
159
|
+
{ to: :"Mongoid::Threaded.identity_map" }
|
160
|
+
))
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,147 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/indexable/specification"
|
3
|
+
require "mongoid/indexable/validators/options"
|
4
|
+
|
5
|
+
module Mongoid
|
6
|
+
|
7
|
+
# Encapsulates behaviour around defining indexes.
|
8
|
+
#
|
9
|
+
# @since 4.0.0
|
10
|
+
module Indexable
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
cattr_accessor :index_specifications
|
15
|
+
self.index_specifications = []
|
16
|
+
end
|
17
|
+
|
18
|
+
module ClassMethods
|
19
|
+
|
20
|
+
# Send the actual index creation comments to the MongoDB driver
|
21
|
+
#
|
22
|
+
# @example Create the indexes for the class.
|
23
|
+
# Person.create_indexes
|
24
|
+
#
|
25
|
+
# @return [ true ] If the operation succeeded.
|
26
|
+
#
|
27
|
+
# @since 1.0.0
|
28
|
+
def create_indexes
|
29
|
+
return unless index_specifications
|
30
|
+
index_specifications.each do |spec|
|
31
|
+
key, options = spec.key, spec.options
|
32
|
+
if database = options[:database]
|
33
|
+
with(consistency: :strong, database: database).
|
34
|
+
collection.indexes.create(key, options.except(:database))
|
35
|
+
else
|
36
|
+
with(consistency: :strong).collection.indexes.create(key, options)
|
37
|
+
end
|
38
|
+
end and true
|
39
|
+
end
|
40
|
+
|
41
|
+
# Send the actual index removal comments to the MongoDB driver,
|
42
|
+
# but lets _id untouched.
|
43
|
+
#
|
44
|
+
# @example Remove the indexes for the class.
|
45
|
+
# Person.remove_indexes
|
46
|
+
#
|
47
|
+
# @return [ true ] If the operation succeeded.
|
48
|
+
#
|
49
|
+
# @since 3.0.0
|
50
|
+
def remove_indexes
|
51
|
+
indexed_database_names.each do |database|
|
52
|
+
collection = with(consistency: :strong, database: database).collection
|
53
|
+
collection.indexes.each do |spec|
|
54
|
+
unless spec["name"] == "_id_"
|
55
|
+
collection.indexes.drop(spec["key"])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end and true
|
59
|
+
end
|
60
|
+
|
61
|
+
# Add the default indexes to the root document if they do not already
|
62
|
+
# exist. Currently this is only _type.
|
63
|
+
#
|
64
|
+
# @example Add Mongoid internal indexes.
|
65
|
+
# Person.add_indexes
|
66
|
+
#
|
67
|
+
# @return [ true ] If the operation succeeded.
|
68
|
+
#
|
69
|
+
# @since 1.0.0
|
70
|
+
def add_indexes
|
71
|
+
if hereditary? && !index_keys.include?(_type: 1)
|
72
|
+
index({ _type: 1 }, unique: false, background: true)
|
73
|
+
end
|
74
|
+
true
|
75
|
+
end
|
76
|
+
|
77
|
+
# Adds an index definition for the provided single or compound keys.
|
78
|
+
#
|
79
|
+
# @example Create a basic index.
|
80
|
+
# class Person
|
81
|
+
# include Mongoid::Document
|
82
|
+
# field :name, type: String
|
83
|
+
# index({ name: 1 }, { background: true })
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# @param [ Symbol ] name The name of the field.
|
87
|
+
# @param [ Hash ] options The index options.
|
88
|
+
#
|
89
|
+
# @return [ Hash ] The index options.
|
90
|
+
#
|
91
|
+
# @since 1.0.0
|
92
|
+
def index(spec, options = nil)
|
93
|
+
specification = Specification.new(self, spec, options)
|
94
|
+
if !index_specifications.include?(specification)
|
95
|
+
index_specifications.push(specification)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
# Get an index specification for the provided key.
|
100
|
+
#
|
101
|
+
# @example Get the index specification.
|
102
|
+
# Model.index_specification(name: 1)
|
103
|
+
#
|
104
|
+
# @param [ Hash ] key The index key/direction pair.
|
105
|
+
#
|
106
|
+
# @return [ Specification ] The found specification.
|
107
|
+
#
|
108
|
+
# @since 4.0.0
|
109
|
+
def index_specification(key)
|
110
|
+
index_specifications.detect{ |spec| spec.fields == key.keys }
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
# Get the names of all databases for this model that have index
|
116
|
+
# definitions.
|
117
|
+
#
|
118
|
+
# @api private
|
119
|
+
#
|
120
|
+
# @example Get the indexed database names.
|
121
|
+
# Model.indexed_database_names
|
122
|
+
#
|
123
|
+
# @return [ Array<String> ] The names.
|
124
|
+
#
|
125
|
+
# @since 3.1.0
|
126
|
+
def indexed_database_names
|
127
|
+
index_specifications.map do |spec|
|
128
|
+
spec.options[:database] || database_name
|
129
|
+
end.uniq
|
130
|
+
end
|
131
|
+
|
132
|
+
# Gets a list of index specification keys.
|
133
|
+
#
|
134
|
+
# @api private
|
135
|
+
#
|
136
|
+
# @example Get the specification key list.
|
137
|
+
# Model.index_keys
|
138
|
+
#
|
139
|
+
# @return [ Array<Hash> ] The specification keys.
|
140
|
+
#
|
141
|
+
# @since 4.0.0
|
142
|
+
def index_keys
|
143
|
+
index_specifications.map{ |spec| spec.key }
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|