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,179 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
class Criteria
|
4
|
+
module Findable
|
5
|
+
|
6
|
+
# Execute the criteria or raise an error if no documents found.
|
7
|
+
#
|
8
|
+
# @example Execute or raise
|
9
|
+
# criteria.execute_or_raise(id)
|
10
|
+
#
|
11
|
+
# @param [ Object ] args The arguments passed.
|
12
|
+
#
|
13
|
+
# @raise [ Errors::DocumentNotFound ] If nothing returned.
|
14
|
+
#
|
15
|
+
# @return [ Document, Array<Document> ] The document(s).
|
16
|
+
#
|
17
|
+
# @since 2.0.0
|
18
|
+
def execute_or_raise(ids, multi)
|
19
|
+
result = multiple_from_map_or_db(ids)
|
20
|
+
check_for_missing_documents!(result, ids)
|
21
|
+
multi ? result : result.first
|
22
|
+
end
|
23
|
+
|
24
|
+
# Find the matchind document(s) in the criteria for the provided ids.
|
25
|
+
#
|
26
|
+
# @example Find by an id.
|
27
|
+
# criteria.find(Moped::BSON::ObjectId.new)
|
28
|
+
#
|
29
|
+
# @example Find by multiple ids.
|
30
|
+
# criteria.find([ Moped::BSON::ObjectId.new, Moped::BSON::ObjectId.new ])
|
31
|
+
#
|
32
|
+
# @param [ Array<Moped::BSON::ObjectId> ] args The ids to search for.
|
33
|
+
#
|
34
|
+
# @return [ Array<Document>, Document ] The matching document(s).
|
35
|
+
#
|
36
|
+
# @since 1.0.0
|
37
|
+
def find(*args)
|
38
|
+
ids = args.__find_args__
|
39
|
+
raise_invalid if ids.any?(&:nil?)
|
40
|
+
for_ids(ids).execute_or_raise(ids, args.multi_arged?)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Adds a criterion to the +Criteria+ that specifies an id that must be matched.
|
44
|
+
#
|
45
|
+
# @example Add a single id criteria.
|
46
|
+
# criteria.for_ids([ 1 ])
|
47
|
+
#
|
48
|
+
# @example Add multiple id criteria.
|
49
|
+
# criteria.for_ids([ 1, 2 ])
|
50
|
+
#
|
51
|
+
# @param [ Array ] ids The array of ids.
|
52
|
+
#
|
53
|
+
# @return [ Criteria ] The cloned criteria.
|
54
|
+
def for_ids(ids)
|
55
|
+
ids = mongoize_ids(ids)
|
56
|
+
if ids.size > 1
|
57
|
+
send(id_finder, { _id: { "$in" => ids }})
|
58
|
+
else
|
59
|
+
send(id_finder, { _id: ids.first })
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Get the document from the identity map, and if not found hit the
|
64
|
+
# database.
|
65
|
+
#
|
66
|
+
# @example Get the document from the map or criteria.
|
67
|
+
# criteria.from_map_or_db
|
68
|
+
#
|
69
|
+
# @return [ Document ] The found document.
|
70
|
+
#
|
71
|
+
# @since 2.2.1
|
72
|
+
def from_map_or_db
|
73
|
+
id = extract_id
|
74
|
+
id = klass.fields["_id"].mongoize(id) if id
|
75
|
+
doc = IdentityMap.get(klass, id || selector_with_type_selection)
|
76
|
+
return nil if doc == {}
|
77
|
+
doc && doc.matches?(selector) ? doc : first
|
78
|
+
end
|
79
|
+
|
80
|
+
# Get the documents from the identity map, and if not found hit the
|
81
|
+
# database.
|
82
|
+
#
|
83
|
+
# @example Get the documents from the map or criteria.
|
84
|
+
# criteria.multiple_from_map_or_db(ids)
|
85
|
+
#
|
86
|
+
# @param [ ids ] The searched ids.
|
87
|
+
#
|
88
|
+
# @return [ Array<Document> ] The found documents.
|
89
|
+
def multiple_from_map_or_db(ids)
|
90
|
+
return entries if embedded?
|
91
|
+
ids = mongoize_ids(ids)
|
92
|
+
result = from_identity_map(ids)
|
93
|
+
ids.empty? ? result : result + from_database(ids)
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
# Get the finder used to generate the id query.
|
99
|
+
#
|
100
|
+
# @api private
|
101
|
+
#
|
102
|
+
# @example Get the id finder.
|
103
|
+
# criteria.id_finder
|
104
|
+
#
|
105
|
+
# @return [ Symbol ] The name of the finder method.
|
106
|
+
#
|
107
|
+
# @since 3.1.0
|
108
|
+
def id_finder
|
109
|
+
@id_finder ||= extract_id ? :all_of : :where
|
110
|
+
end
|
111
|
+
|
112
|
+
# Get documents from the database only.
|
113
|
+
#
|
114
|
+
# @api private
|
115
|
+
#
|
116
|
+
# @example Get documents from the database.
|
117
|
+
# criteria.from_database(ids)
|
118
|
+
#
|
119
|
+
# @param [ Array<Object> ] ids The ids to fetch with.
|
120
|
+
#
|
121
|
+
# @return [ Array<Document> ] The matching documents.
|
122
|
+
#
|
123
|
+
# @since 3.0.0
|
124
|
+
def from_database(ids)
|
125
|
+
(ids.size > 1 ? any_in(id: ids) : where(id: ids.first)).entries
|
126
|
+
end
|
127
|
+
|
128
|
+
# Get documents from the identity map only.
|
129
|
+
#
|
130
|
+
# @api private
|
131
|
+
#
|
132
|
+
# @example Get documents from the identity map.
|
133
|
+
# criteria.from_identity_map(ids)
|
134
|
+
#
|
135
|
+
# @param [ Array<Object> ] ids The ids to fetch with.
|
136
|
+
#
|
137
|
+
# @return [ Array<Document> ] The matching documents.
|
138
|
+
#
|
139
|
+
# @since 3.0.0
|
140
|
+
def from_identity_map(ids)
|
141
|
+
result = []
|
142
|
+
selection = selector_with_type_selection
|
143
|
+
ids.reject! do |id|
|
144
|
+
doc = IdentityMap.get(klass, id)
|
145
|
+
doc && doc.matches?(selection) ? result.push(doc) : false
|
146
|
+
end
|
147
|
+
result
|
148
|
+
end
|
149
|
+
|
150
|
+
# Convert all the ids to their proper types.
|
151
|
+
#
|
152
|
+
# @api private
|
153
|
+
#
|
154
|
+
# @example Convert the ids.
|
155
|
+
# criteria.mongoize_ids(ids)
|
156
|
+
#
|
157
|
+
# @param [ Array<Object> ] ids The ids to convert.
|
158
|
+
#
|
159
|
+
# @return [ Array<Object> ] The converted ids.
|
160
|
+
#
|
161
|
+
# @since 3.0.0
|
162
|
+
def mongoize_ids(ids)
|
163
|
+
ids.map{ |id| klass.fields["_id"].mongoize(id) }
|
164
|
+
end
|
165
|
+
|
166
|
+
# Convenience method of raising an invalid options error.
|
167
|
+
#
|
168
|
+
# @example Raise the error.
|
169
|
+
# criteria.raise_invalid
|
170
|
+
#
|
171
|
+
# @raise [ Errors::InvalidOptions ] The error.
|
172
|
+
#
|
173
|
+
# @since 2.0.0
|
174
|
+
def raise_invalid
|
175
|
+
raise Errors::InvalidFind.new
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
class Criteria
|
4
|
+
module Inspectable
|
5
|
+
|
6
|
+
# Get a pretty string representation of the criteria, including the
|
7
|
+
# selector, options, matching count and documents for inspection.
|
8
|
+
#
|
9
|
+
# @example Inspect the criteria.
|
10
|
+
# criteria.inspect
|
11
|
+
#
|
12
|
+
# @return [ String ] The inspection string.
|
13
|
+
#
|
14
|
+
# @since 1.0.0
|
15
|
+
def inspect
|
16
|
+
%Q{#<Mongoid::Criteria
|
17
|
+
selector: #{selector.inspect}
|
18
|
+
options: #{options.inspect}
|
19
|
+
class: #{klass}
|
20
|
+
embedded: #{embedded?}>
|
21
|
+
}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
class Criteria
|
4
|
+
module Marshalable
|
5
|
+
|
6
|
+
# Provides the data needed to Marshal.dump a criteria.
|
7
|
+
#
|
8
|
+
# @example Dump the criteria.
|
9
|
+
# Marshal.dump(criteria)
|
10
|
+
#
|
11
|
+
# @return [ Array<Object> ] The dumped data.
|
12
|
+
#
|
13
|
+
# @since 3.0.15
|
14
|
+
def marshal_dump
|
15
|
+
data = [ klass, driver, inclusions, documents, strategy, negating ]
|
16
|
+
data.push(scoping_options).push(dump_hash(:selector)).push(dump_hash(:options))
|
17
|
+
end
|
18
|
+
|
19
|
+
# Resets the criteria object after a Marshal.load
|
20
|
+
#
|
21
|
+
# @example Load the criteria.
|
22
|
+
# Marshal.load(criteria)
|
23
|
+
#
|
24
|
+
# @param [ Array ] data The raw data.
|
25
|
+
#
|
26
|
+
# @since 3.0.15
|
27
|
+
def marshal_load(data)
|
28
|
+
@scoping_options, raw_selector, raw_options = data.pop(3)
|
29
|
+
@klass, @driver, @inclusions, @documents, @strategy, @negating = data
|
30
|
+
@selector = load_hash(Origin::Selector, raw_selector)
|
31
|
+
@options = load_hash(Origin::Options, raw_options)
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def dump_hash(name)
|
37
|
+
send(name).inject({}) do |raw, (key, value)|
|
38
|
+
raw[key] = value
|
39
|
+
raw
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def load_hash(hash_class, raw)
|
44
|
+
hash = hash_class.new(klass.aliased_fields, klass.fields)
|
45
|
+
hash.merge!(raw)
|
46
|
+
hash
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
class Criteria
|
4
|
+
module Modifiable
|
5
|
+
|
6
|
+
# Build a document given the selector and return it.
|
7
|
+
# Complex criteria, such as $in and $or operations will get ignored.
|
8
|
+
#
|
9
|
+
# @example build the document.
|
10
|
+
# Person.where(:title => "Sir").build
|
11
|
+
#
|
12
|
+
# @example Build with selectors getting ignored.
|
13
|
+
# Person.where(:age.gt => 5).build
|
14
|
+
#
|
15
|
+
# @return [ Document ] A non-persisted document.
|
16
|
+
#
|
17
|
+
# @since 2.0.0
|
18
|
+
def build(attrs = {}, &block)
|
19
|
+
create_document(:new, attrs, &block)
|
20
|
+
end
|
21
|
+
alias :new :build
|
22
|
+
|
23
|
+
# Create a document in the database given the selector and return it.
|
24
|
+
# Complex criteria, such as $in and $or operations will get ignored.
|
25
|
+
#
|
26
|
+
# @example Create the document.
|
27
|
+
# Person.where(:title => "Sir").create
|
28
|
+
#
|
29
|
+
# @example Create with selectors getting ignored.
|
30
|
+
# Person.where(:age.gt => 5).create
|
31
|
+
#
|
32
|
+
# @return [ Document ] A newly created document.
|
33
|
+
#
|
34
|
+
# @since 2.0.0.rc.1
|
35
|
+
def create(attrs = {}, &block)
|
36
|
+
create_document(:create, attrs, &block)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Create a document in the database given the selector and return it.
|
40
|
+
# Complex criteria, such as $in and $or operations will get ignored.
|
41
|
+
# If validation fails, an error will be raised.
|
42
|
+
#
|
43
|
+
# @example Create the document.
|
44
|
+
# Person.where(:title => "Sir").create
|
45
|
+
#
|
46
|
+
# @example Create with selectors getting ignored.
|
47
|
+
# Person.where(:age.gt => 5).create
|
48
|
+
#
|
49
|
+
# @raise [ Errors::Validations ] on a validation error.
|
50
|
+
#
|
51
|
+
# @return [ Document ] A newly created document.
|
52
|
+
#
|
53
|
+
# @since 3.0.0
|
54
|
+
def create!(attrs = {}, &block)
|
55
|
+
create_document(:create!, attrs, &block)
|
56
|
+
end
|
57
|
+
|
58
|
+
# Find the first +Document+ given the conditions, or creates a new document
|
59
|
+
# with the conditions that were supplied.
|
60
|
+
#
|
61
|
+
# @example Find or create the document.
|
62
|
+
# Person.find_or_create_by(:attribute => "value")
|
63
|
+
#
|
64
|
+
# @param [ Hash ] attrs The attributes to check.
|
65
|
+
#
|
66
|
+
# @return [ Document ] A matching or newly created document.
|
67
|
+
def find_or_create_by(attrs = {}, &block)
|
68
|
+
find_or(:create, attrs, &block)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Find the first +Document+ given the conditions, or initializes a new document
|
72
|
+
# with the conditions that were supplied.
|
73
|
+
#
|
74
|
+
# @example Find or initialize the document.
|
75
|
+
# Person.find_or_initialize_by(:attribute => "value")
|
76
|
+
#
|
77
|
+
# @param [ Hash ] attrs The attributes to check.
|
78
|
+
#
|
79
|
+
# @return [ Document ] A matching or newly initialized document.
|
80
|
+
def find_or_initialize_by(attrs = {}, &block)
|
81
|
+
find_or(:new, attrs, &block)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Find the first +Document+, or creates a new document
|
85
|
+
# with the conditions that were supplied plus attributes.
|
86
|
+
#
|
87
|
+
# @example First or create the document.
|
88
|
+
# Person.where(name: "Jon").first_or_create(attribute: "value")
|
89
|
+
#
|
90
|
+
# @param [ Hash ] attrs The additional attributes to add.
|
91
|
+
#
|
92
|
+
# @return [ Document ] A matching or newly created document.
|
93
|
+
#
|
94
|
+
# @since 3.1.0
|
95
|
+
def first_or_create(attrs = nil, &block)
|
96
|
+
first_or(:create, attrs, &block)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Find the first +Document+, or creates a new document
|
100
|
+
# with the conditions that were supplied plus attributes and will
|
101
|
+
# raise an error if validation fails.
|
102
|
+
#
|
103
|
+
# @example First or create the document.
|
104
|
+
# Person.where(name: "Jon").first_or_create!(attribute: "value")
|
105
|
+
#
|
106
|
+
# @param [ Hash ] attrs The additional attributes to add.
|
107
|
+
#
|
108
|
+
# @return [ Document ] A matching or newly created document.
|
109
|
+
#
|
110
|
+
# @since 3.1.0
|
111
|
+
def first_or_create!(attrs = nil, &block)
|
112
|
+
first_or(:create!, attrs, &block)
|
113
|
+
end
|
114
|
+
|
115
|
+
# Find the first +Document+, or initializes a new document
|
116
|
+
# with the conditions that were supplied plus attributes.
|
117
|
+
#
|
118
|
+
# @example First or initialize the document.
|
119
|
+
# Person.where(name: "Jon").first_or_initialize(attribute: "value")
|
120
|
+
#
|
121
|
+
# @param [ Hash ] attrs The additional attributes to add.
|
122
|
+
#
|
123
|
+
# @return [ Document ] A matching or newly initialized document.
|
124
|
+
#
|
125
|
+
# @since 3.1.0
|
126
|
+
def first_or_initialize(attrs = nil, &block)
|
127
|
+
first_or(:new, attrs, &block)
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
# Create a document given the provided method and attributes from the
|
133
|
+
# existing selector.
|
134
|
+
#
|
135
|
+
# @api private
|
136
|
+
#
|
137
|
+
# @example Create a new document.
|
138
|
+
# criteria.create_document(:new, {})
|
139
|
+
#
|
140
|
+
# @param [ Symbol ] method Either :new or :create.
|
141
|
+
# @param [ Hash ] attrs Additional attributes to use.
|
142
|
+
#
|
143
|
+
# @return [ Document ] The new or saved document.
|
144
|
+
#
|
145
|
+
# @since 3.0.0
|
146
|
+
def create_document(method, attrs = nil, &block)
|
147
|
+
klass.__send__(method,
|
148
|
+
selector.reduce(attrs || {}) do |hash, (key, value)|
|
149
|
+
unless key.to_s =~ /\$/ || value.is_a?(Hash)
|
150
|
+
hash[key] = value
|
151
|
+
end
|
152
|
+
hash
|
153
|
+
end, &block)
|
154
|
+
end
|
155
|
+
|
156
|
+
# Find the first object or create/initialize it.
|
157
|
+
#
|
158
|
+
# @api private
|
159
|
+
#
|
160
|
+
# @example Find or perform an action.
|
161
|
+
# Person.find_or(:create, :name => "Dev")
|
162
|
+
#
|
163
|
+
# @param [ Symbol ] method The method to invoke.
|
164
|
+
# @param [ Hash ] attrs The attributes to query or set.
|
165
|
+
#
|
166
|
+
# @return [ Document ] The first or new document.
|
167
|
+
def find_or(method, attrs = {}, &block)
|
168
|
+
where(attrs).first || send(method, attrs, &block)
|
169
|
+
end
|
170
|
+
|
171
|
+
# Find the first document or create/initialize it.
|
172
|
+
#
|
173
|
+
# @api private
|
174
|
+
#
|
175
|
+
# @example First or perform an action.
|
176
|
+
# Person.first_or(:create, :name => "Dev")
|
177
|
+
#
|
178
|
+
# @param [ Symbol ] method The method to invoke.
|
179
|
+
# @param [ Hash ] attrs The attributes to query or set.
|
180
|
+
#
|
181
|
+
# @return [ Document ] The first or new document.
|
182
|
+
#
|
183
|
+
# @since 3.1.0
|
184
|
+
def first_or(method, attrs = {}, &block)
|
185
|
+
first || create_document(method, attrs, &block)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
class Criteria
|
4
|
+
module Scopable
|
5
|
+
|
6
|
+
# Applies the default scope to the criteria.
|
7
|
+
#
|
8
|
+
# @example Apply the default scope.
|
9
|
+
# criteria.apply_default_scope
|
10
|
+
#
|
11
|
+
# @return [ Criteria ] The criteria.
|
12
|
+
#
|
13
|
+
# @since 3.0.0
|
14
|
+
def apply_default_scope
|
15
|
+
klass.without_default_scope do
|
16
|
+
merge!(klass.default_scoping.call)
|
17
|
+
end
|
18
|
+
self.scoping_options = true, false
|
19
|
+
end
|
20
|
+
|
21
|
+
# Given another criteria, remove the other criteria's scoping from this
|
22
|
+
# criteria.
|
23
|
+
#
|
24
|
+
# @example Remove the scoping.
|
25
|
+
# criteria.remove_scoping(other)
|
26
|
+
#
|
27
|
+
# @param [ Criteria ] other The other criteria.
|
28
|
+
#
|
29
|
+
# @return [ Criteria ] The criteria with scoping removed.
|
30
|
+
#
|
31
|
+
# @since 3.0.0
|
32
|
+
def remove_scoping(other)
|
33
|
+
if other
|
34
|
+
reject_matching(other, :selector, :options)
|
35
|
+
other.inclusions.each do |meta|
|
36
|
+
inclusions.delete_one(meta)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
# Forces the criteria to be scoped, unless its inside an unscoped block.
|
43
|
+
#
|
44
|
+
# @example Force the criteria to be scoped.
|
45
|
+
# criteria.scoped(skip: 10)
|
46
|
+
#
|
47
|
+
# @param [ Hash ] options Additional query options.
|
48
|
+
#
|
49
|
+
# @return [ Criteria ] The scoped criteria.
|
50
|
+
#
|
51
|
+
# @since 3.0.0
|
52
|
+
def scoped(options = nil)
|
53
|
+
crit = clone
|
54
|
+
crit.options.merge!(options || {})
|
55
|
+
if klass.default_scopable? && !scoped?
|
56
|
+
crit.apply_default_scope
|
57
|
+
end
|
58
|
+
crit
|
59
|
+
end
|
60
|
+
|
61
|
+
# Has the criteria had the default scope applied?
|
62
|
+
#
|
63
|
+
# @example Is the default scope applied?
|
64
|
+
# criteria.scoped?
|
65
|
+
#
|
66
|
+
# @return [ true, false ] If the default scope is applied.
|
67
|
+
#
|
68
|
+
# @since 3.0.0
|
69
|
+
def scoped?
|
70
|
+
!!(defined?(@scoped) ? @scoped : nil)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Clears all scoping from the criteria.
|
74
|
+
#
|
75
|
+
# @example Clear all scoping from the criteria.
|
76
|
+
# criteria.unscoped
|
77
|
+
#
|
78
|
+
# @return [ Criteria ] The unscoped criteria.
|
79
|
+
#
|
80
|
+
# @since 3.0.0
|
81
|
+
def unscoped
|
82
|
+
crit = clone
|
83
|
+
unless unscoped?
|
84
|
+
crit.scoping_options = false, true
|
85
|
+
crit.selector.clear; crit.options.clear
|
86
|
+
end
|
87
|
+
crit
|
88
|
+
end
|
89
|
+
|
90
|
+
# Is the criteria unscoped?
|
91
|
+
#
|
92
|
+
# @example Is the criteria unscoped?
|
93
|
+
# criteria.unscoped?
|
94
|
+
#
|
95
|
+
# @return [ true, false ] If the criteria is force unscoped.
|
96
|
+
#
|
97
|
+
# @since 3.0.0
|
98
|
+
def unscoped?
|
99
|
+
!!(defined?(@unscoped) ? @unscoped : nil)
|
100
|
+
end
|
101
|
+
|
102
|
+
# Get the criteria scoping options, as a pair (scoped, unscoped).
|
103
|
+
#
|
104
|
+
# @example Get the scoping options.
|
105
|
+
# criteria.scoping_options
|
106
|
+
#
|
107
|
+
# @return [ Array ] Scoped, unscoped.
|
108
|
+
#
|
109
|
+
# @since 3.0.0
|
110
|
+
def scoping_options
|
111
|
+
[ (defined?(@scoped) ? @scoped : nil), (defined?(@unscoped) ? @unscoped : nil) ]
|
112
|
+
end
|
113
|
+
|
114
|
+
# Set the criteria scoping options, as a pair (scoped, unscoped).
|
115
|
+
#
|
116
|
+
# @example Set the scoping options.
|
117
|
+
# criteria.scoping_options = true, false
|
118
|
+
#
|
119
|
+
# @param [ Array ] options Scoped, unscoped.
|
120
|
+
#
|
121
|
+
# @return [ Array ] The new scoping options.
|
122
|
+
#
|
123
|
+
# @since 3.0.0
|
124
|
+
def scoping_options=(options)
|
125
|
+
@scoped, @unscoped = options
|
126
|
+
end
|
127
|
+
|
128
|
+
# Get the criteria with the default scope applied, if the default scope
|
129
|
+
# is able to be applied. Cases in which it cannot are: If we are in an
|
130
|
+
# unscoped block, if the criteria is already forced unscoped, or the
|
131
|
+
# default scope has already been applied.
|
132
|
+
#
|
133
|
+
# @example Get the criteria with the default scope.
|
134
|
+
# criteria.with_default_scope
|
135
|
+
#
|
136
|
+
# @return [ Criteria ] The criteria.
|
137
|
+
#
|
138
|
+
# @since 3.0.0
|
139
|
+
def with_default_scope
|
140
|
+
crit = clone
|
141
|
+
if klass.default_scopable? && !unscoped? && !scoped?
|
142
|
+
crit.apply_default_scope
|
143
|
+
end
|
144
|
+
crit
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def reject_matching(other, *methods)
|
150
|
+
methods.each do |method|
|
151
|
+
send(method).reject! do |key, value|
|
152
|
+
other.send(method).has_key?(key) && other.send(method)[key] == value
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|