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,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Contextual
|
4
|
+
module Queryable
|
5
|
+
|
6
|
+
# @attribute [r] collection The collection to query against.
|
7
|
+
# @attribute [r] criteria The criteria for the context.
|
8
|
+
# @attribute [r] klass The klass for the criteria.
|
9
|
+
attr_reader :collection, :criteria, :klass
|
10
|
+
|
11
|
+
# Is the enumerable of matching documents empty?
|
12
|
+
#
|
13
|
+
# @example Is the context empty?
|
14
|
+
# context.blank?
|
15
|
+
#
|
16
|
+
# @return [ true, false ] If the context is empty.
|
17
|
+
#
|
18
|
+
# @since 3.0.0
|
19
|
+
def blank?
|
20
|
+
!exists?
|
21
|
+
end
|
22
|
+
alias :empty? :blank?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Contextual
|
4
|
+
|
5
|
+
# Wraps behaviour around a lazy text search command.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
class TextSearch
|
9
|
+
include Enumerable
|
10
|
+
include Command
|
11
|
+
|
12
|
+
delegate :[], to: :results
|
13
|
+
delegate :==, :empty?, to: :entries
|
14
|
+
|
15
|
+
# Iterate over the results of the text search command.
|
16
|
+
#
|
17
|
+
# @example Iterate over the results.
|
18
|
+
# text_search.each do |doc|
|
19
|
+
# #...
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# @return [ Enumerator ] The enumerator.
|
23
|
+
#
|
24
|
+
# @since 4.0.0
|
25
|
+
def each
|
26
|
+
if block_given?
|
27
|
+
selecting(:project) do
|
28
|
+
documents.each do |doc|
|
29
|
+
yield doc
|
30
|
+
end
|
31
|
+
end
|
32
|
+
else
|
33
|
+
to_enum
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Instantiate a new text search lazy proxy.
|
38
|
+
#
|
39
|
+
# @example Instantiate the text search.
|
40
|
+
# TextSearch.new(collection, criteria, "test")
|
41
|
+
#
|
42
|
+
# @param [ Moped::Collection ] collection The collection to execute on.
|
43
|
+
# @param [ Criteria ] criteria The criteria to filter results.
|
44
|
+
# @param [ String ] search_string The search string.
|
45
|
+
#
|
46
|
+
# @since 4.0.0
|
47
|
+
def initialize(collection, criteria, search_string)
|
48
|
+
@collection, @criteria = collection, criteria
|
49
|
+
command[:text] = collection.name.to_s
|
50
|
+
command[:search] = search_string
|
51
|
+
apply_criteria_options
|
52
|
+
end
|
53
|
+
|
54
|
+
# Inspect the text search object.
|
55
|
+
#
|
56
|
+
# @example Inspect the text search.
|
57
|
+
# text_search.inspect
|
58
|
+
#
|
59
|
+
# @return [ String ] The inspection.
|
60
|
+
#
|
61
|
+
# @since 4.0.0
|
62
|
+
def inspect
|
63
|
+
%Q{#<Mongoid::Contextual::TextSearch
|
64
|
+
selector: #{criteria.selector.inspect}
|
65
|
+
class: #{criteria.klass}
|
66
|
+
search: #{command[:search]}
|
67
|
+
filter: #{command[:filter] || "N/A"}
|
68
|
+
project: #{command[:project] || "N/A"}
|
69
|
+
limit: #{command[:limit] || "N/A"}
|
70
|
+
language: #{command[:language] || "default"}>
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
# Execute the text search command, and return the raw results (in hash
|
75
|
+
# form).
|
76
|
+
#
|
77
|
+
# @example Execute the command.
|
78
|
+
# text_search.execute
|
79
|
+
#
|
80
|
+
# @return [ Hash ] The raw results.
|
81
|
+
#
|
82
|
+
# @since 4.0.0
|
83
|
+
def execute
|
84
|
+
results
|
85
|
+
end
|
86
|
+
|
87
|
+
# Set the language of the text search.
|
88
|
+
#
|
89
|
+
# @example Set the text search language.
|
90
|
+
# text_search.language("deutsch")
|
91
|
+
#
|
92
|
+
# @param [ String ] value The name of the language.
|
93
|
+
#
|
94
|
+
# @return [ TextSearch ] The modified text search.
|
95
|
+
#
|
96
|
+
# @since 4.0.0
|
97
|
+
def language(value)
|
98
|
+
command[:language] = value
|
99
|
+
self
|
100
|
+
end
|
101
|
+
|
102
|
+
# Limits the fields returned by the text search for each document. By
|
103
|
+
# default, _id is always included.
|
104
|
+
#
|
105
|
+
# @example Limit the returned fields.
|
106
|
+
# text_search.project(name: 1, title: 1)
|
107
|
+
#
|
108
|
+
# @param [ Hash ] value The fields to project.
|
109
|
+
#
|
110
|
+
# @return [ TextSearch ] The modified text search.
|
111
|
+
#
|
112
|
+
# @since 4.0.0
|
113
|
+
def project(value)
|
114
|
+
command[:project] = value
|
115
|
+
self
|
116
|
+
end
|
117
|
+
|
118
|
+
# Get the raw statistics returned from the text search.
|
119
|
+
#
|
120
|
+
# @example Get the stats.
|
121
|
+
# text_search.stats
|
122
|
+
#
|
123
|
+
# @return [ Hash ] The raw statistics.
|
124
|
+
#
|
125
|
+
# @since 4.0.0
|
126
|
+
def stats
|
127
|
+
results["stats"]
|
128
|
+
end
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
# Apply the options from the criteria to the text search command.
|
133
|
+
#
|
134
|
+
# @api private
|
135
|
+
#
|
136
|
+
# @example Apply the criteria options, filter and limit only.
|
137
|
+
# text_search.apply_criteria_options
|
138
|
+
#
|
139
|
+
# @return [ nil ] Nothing.
|
140
|
+
#
|
141
|
+
# @since 4.0.0
|
142
|
+
def apply_criteria_options
|
143
|
+
command[:filter] = criteria.selector
|
144
|
+
if limit = criteria.options[:limit]
|
145
|
+
command[:limit] = limit
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# Get the results of the text search as documents.
|
150
|
+
#
|
151
|
+
# @api private
|
152
|
+
#
|
153
|
+
# @example Get the results as documents.
|
154
|
+
# text_search.documents
|
155
|
+
#
|
156
|
+
# @return [ Array<Document> ] The documents.
|
157
|
+
#
|
158
|
+
# @since 4.0.0
|
159
|
+
def documents
|
160
|
+
results["results"].map do |attributes|
|
161
|
+
Factory.from_db(criteria.klass, attributes["obj"], criteria.object_id)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
# Get the raw results.
|
166
|
+
#
|
167
|
+
# @api private
|
168
|
+
#
|
169
|
+
# @example Get the raw results.
|
170
|
+
# text_search.results
|
171
|
+
#
|
172
|
+
# @return [ Hash ] The raw results.
|
173
|
+
#
|
174
|
+
# @since 4.0.0
|
175
|
+
def results
|
176
|
+
@results ||= session.command(command)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module contains the behaviour of Mongoid's clone/dup of documents.
|
5
|
+
module Copyable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
# Clone or dup the current +Document+. This will return all attributes with
|
9
|
+
# the exception of the document's id and versions, and will reset all the
|
10
|
+
# instance variables.
|
11
|
+
#
|
12
|
+
# This clone also includes embedded documents.
|
13
|
+
#
|
14
|
+
# @example Clone the document.
|
15
|
+
# document.clone
|
16
|
+
#
|
17
|
+
# @param [ Document ] other The document getting cloned.
|
18
|
+
#
|
19
|
+
# @return [ Document ] The new document.
|
20
|
+
def clone
|
21
|
+
# @note This next line is here to address #2704, even though having an
|
22
|
+
# _id and id field in the document would cause problems with Mongoid
|
23
|
+
# elsewhere.
|
24
|
+
attrs = clone_document.except("_id", "id")
|
25
|
+
self.class.new(attrs)
|
26
|
+
end
|
27
|
+
alias :dup :clone
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# Clone the document attributes
|
32
|
+
#
|
33
|
+
# @api private
|
34
|
+
#
|
35
|
+
# @example clone document
|
36
|
+
# model.clone_document
|
37
|
+
#
|
38
|
+
# @param [ Hash ] dcoument The document with hash format
|
39
|
+
#
|
40
|
+
# @since 3.0.22
|
41
|
+
def clone_document
|
42
|
+
attrs = as_document.__deep_copy__
|
43
|
+
attrs["version"] = 1 if attrs.delete("versions")
|
44
|
+
process_localized_attributes(attrs)
|
45
|
+
attrs
|
46
|
+
end
|
47
|
+
|
48
|
+
# When cloning, if the document has localized fields we need to ensure they
|
49
|
+
# are properly processed in the clone.
|
50
|
+
#
|
51
|
+
# @api private
|
52
|
+
#
|
53
|
+
# @example Process localized attributes.
|
54
|
+
# model.process_localized_attributes(attributes)
|
55
|
+
#
|
56
|
+
# @param [ Hash ] attrs The attributes.
|
57
|
+
#
|
58
|
+
# @since 3.0.20
|
59
|
+
def process_localized_attributes(attrs)
|
60
|
+
localized_fields.keys.each do |name|
|
61
|
+
if value = attrs.delete(name)
|
62
|
+
attrs["#{name}_translations"] = value
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,562 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/criteria/findable"
|
3
|
+
require "mongoid/criteria/inspectable"
|
4
|
+
require "mongoid/criteria/marshalable"
|
5
|
+
require "mongoid/criteria/modifiable"
|
6
|
+
require "mongoid/criteria/scopable"
|
7
|
+
require "mongoid/sessions/options"
|
8
|
+
|
9
|
+
module Mongoid
|
10
|
+
|
11
|
+
# The +Criteria+ class is the core object needed in Mongoid to retrieve
|
12
|
+
# objects from the database. It is a DSL that essentially sets up the
|
13
|
+
# selector and options arguments that get passed on to a Mongo::Collection
|
14
|
+
# in the Ruby driver. Each method on the +Criteria+ returns self to they
|
15
|
+
# can be chained in order to create a readable criterion to be executed
|
16
|
+
# against the database.
|
17
|
+
class Criteria
|
18
|
+
include Enumerable
|
19
|
+
include Contextual
|
20
|
+
include Origin::Queryable
|
21
|
+
include Findable
|
22
|
+
include Inspectable
|
23
|
+
include Marshalable
|
24
|
+
include Modifiable
|
25
|
+
include Scopable
|
26
|
+
include Sessions::Options
|
27
|
+
|
28
|
+
# Static array used to check with method missing - we only need to ever
|
29
|
+
# instantiate once.
|
30
|
+
#
|
31
|
+
# @since 4.0.0
|
32
|
+
CHECK = []
|
33
|
+
|
34
|
+
attr_accessor :embedded, :klass
|
35
|
+
|
36
|
+
# Returns true if the supplied +Enumerable+ or +Criteria+ is equal to the results
|
37
|
+
# of this +Criteria+ or the criteria itself.
|
38
|
+
#
|
39
|
+
# @note This will force a database load when called if an enumerable is passed.
|
40
|
+
#
|
41
|
+
# @param [ Object ] other The other +Enumerable+ or +Criteria+ to compare to.
|
42
|
+
#
|
43
|
+
# @return [ true, false ] If the objects are equal.
|
44
|
+
#
|
45
|
+
# @since 1.0.0
|
46
|
+
def ==(other)
|
47
|
+
return super if other.respond_to?(:selector)
|
48
|
+
entries == other
|
49
|
+
end
|
50
|
+
|
51
|
+
# Needed to properly get a criteria back as json
|
52
|
+
#
|
53
|
+
# @example Get the criteria as json.
|
54
|
+
# Person.where(:title => "Sir").as_json
|
55
|
+
#
|
56
|
+
# @param [ Hash ] options Options to pass through to the serializer.
|
57
|
+
#
|
58
|
+
# @return [ String ] The JSON string.
|
59
|
+
def as_json(options = nil)
|
60
|
+
entries.as_json(options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Tells the criteria that the cursor that gets returned needs to be
|
64
|
+
# cached. This is so multiple iterations don't hit the database multiple
|
65
|
+
# times, however this is not advisable when working with large data sets
|
66
|
+
# as the entire results will get stored in memory.
|
67
|
+
#
|
68
|
+
# @example Flag the criteria as cached.
|
69
|
+
# criteria.cache
|
70
|
+
#
|
71
|
+
# @return [ Criteria ] The cloned criteria.
|
72
|
+
def cache
|
73
|
+
crit = clone
|
74
|
+
crit.options.merge!(cache: true)
|
75
|
+
crit
|
76
|
+
end
|
77
|
+
|
78
|
+
# Will return true if the cache option has been set.
|
79
|
+
#
|
80
|
+
# @example Is the criteria cached?
|
81
|
+
# criteria.cached?
|
82
|
+
#
|
83
|
+
# @return [ true, false ] If the criteria is flagged as cached.
|
84
|
+
def cached?
|
85
|
+
options[:cache] == true
|
86
|
+
end
|
87
|
+
|
88
|
+
# Get the documents from the embedded criteria.
|
89
|
+
#
|
90
|
+
# @example Get the documents.
|
91
|
+
# criteria.documents
|
92
|
+
#
|
93
|
+
# @return [ Array<Document> ] The documents.
|
94
|
+
#
|
95
|
+
# @since 3.0.0
|
96
|
+
def documents
|
97
|
+
@documents ||= []
|
98
|
+
end
|
99
|
+
|
100
|
+
# Set the embedded documents on the criteria.
|
101
|
+
#
|
102
|
+
# @example Set the documents.
|
103
|
+
#
|
104
|
+
# @param [ Array<Document> ] docs The embedded documents.
|
105
|
+
#
|
106
|
+
# @return [ Array<Document> ] The embedded documents.
|
107
|
+
#
|
108
|
+
# @since 3.0.0
|
109
|
+
def documents=(docs)
|
110
|
+
@documents = docs
|
111
|
+
end
|
112
|
+
|
113
|
+
# Is the criteria for embedded documents?
|
114
|
+
#
|
115
|
+
# @example Is the criteria for embedded documents?
|
116
|
+
# criteria.embedded?
|
117
|
+
#
|
118
|
+
# @return [ true, false ] If the criteria is embedded.
|
119
|
+
#
|
120
|
+
# @since 3.0.0
|
121
|
+
def embedded?
|
122
|
+
!!@embedded
|
123
|
+
end
|
124
|
+
|
125
|
+
# Extract a single id from the provided criteria. Could be in an $and
|
126
|
+
# query or a straight _id query.
|
127
|
+
#
|
128
|
+
# @example Extract the id.
|
129
|
+
# criteria.extract_id
|
130
|
+
#
|
131
|
+
# @return [ Object ] The id.
|
132
|
+
#
|
133
|
+
# @since 2.3.0
|
134
|
+
def extract_id
|
135
|
+
selector.extract_id
|
136
|
+
end
|
137
|
+
|
138
|
+
# Adds a criterion to the +Criteria+ that specifies additional options
|
139
|
+
# to be passed to the Ruby driver, in the exact format for the driver.
|
140
|
+
#
|
141
|
+
# @example Add extra params to the criteria.
|
142
|
+
# criteria.extras(:limit => 20, :skip => 40)
|
143
|
+
#
|
144
|
+
# @param [ Hash ] extras The extra driver options.
|
145
|
+
#
|
146
|
+
# @return [ Criteria ] The cloned criteria.
|
147
|
+
#
|
148
|
+
# @since 2.0.0
|
149
|
+
def extras(extras)
|
150
|
+
crit = clone
|
151
|
+
crit.options.merge!(extras)
|
152
|
+
crit
|
153
|
+
end
|
154
|
+
|
155
|
+
# Get the list of included fields.
|
156
|
+
#
|
157
|
+
# @example Get the field list.
|
158
|
+
# criteria.field_list
|
159
|
+
#
|
160
|
+
# @return [ Array<String> ] The fields.
|
161
|
+
#
|
162
|
+
# @since 2.0.0
|
163
|
+
def field_list
|
164
|
+
if options[:fields]
|
165
|
+
options[:fields].keys.reject{ |key| key == "_type" }
|
166
|
+
else
|
167
|
+
[]
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# When freezing a criteria we need to initialize the context first
|
172
|
+
# otherwise the setting of the context on attempted iteration will raise a
|
173
|
+
# runtime error.
|
174
|
+
#
|
175
|
+
# @example Freeze the criteria.
|
176
|
+
# criteria.freeze
|
177
|
+
#
|
178
|
+
# @return [ Criteria ] The frozen criteria.
|
179
|
+
#
|
180
|
+
# @since 2.0.0
|
181
|
+
def freeze
|
182
|
+
context and inclusions and super
|
183
|
+
end
|
184
|
+
|
185
|
+
# Initialize the new criteria.
|
186
|
+
#
|
187
|
+
# @example Init the new criteria.
|
188
|
+
# Criteria.new(Band)
|
189
|
+
#
|
190
|
+
# @param [ Class ] klass The model class.
|
191
|
+
#
|
192
|
+
# @since 1.0.0
|
193
|
+
def initialize(klass)
|
194
|
+
@klass = klass
|
195
|
+
klass ? super(klass.aliased_fields, klass.fields) : super({}, {})
|
196
|
+
end
|
197
|
+
|
198
|
+
# Eager loads all the provided relations. Will load all the documents
|
199
|
+
# into the identity map who's ids match based on the extra query for the
|
200
|
+
# ids.
|
201
|
+
#
|
202
|
+
# @note This will only work if Mongoid's identity map is enabled. To do
|
203
|
+
# so set identity_map_enabled: true in your mongoid.yml
|
204
|
+
#
|
205
|
+
# @note This will work for embedded relations that reference another
|
206
|
+
# collection via belongs_to as well.
|
207
|
+
#
|
208
|
+
# @note Eager loading brings all the documents into memory, so there is a
|
209
|
+
# sweet spot on the performance gains. Internal benchmarks show that
|
210
|
+
# eager loading becomes slower around 100k documents, but this will
|
211
|
+
# naturally depend on the specific application.
|
212
|
+
#
|
213
|
+
# @example Eager load the provided relations.
|
214
|
+
# Person.includes(:posts, :game)
|
215
|
+
#
|
216
|
+
# @param [ Array<Symbol> ] relations The names of the relations to eager
|
217
|
+
# load.
|
218
|
+
#
|
219
|
+
# @return [ Criteria ] The cloned criteria.
|
220
|
+
#
|
221
|
+
# @since 2.2.0
|
222
|
+
def includes(*relations)
|
223
|
+
relations.flatten.each do |name|
|
224
|
+
metadata = klass.reflect_on_association(name)
|
225
|
+
raise Errors::InvalidIncludes.new(klass, relations) unless metadata
|
226
|
+
inclusions.push(metadata) unless inclusions.include?(metadata)
|
227
|
+
end
|
228
|
+
clone
|
229
|
+
end
|
230
|
+
|
231
|
+
# Get a list of criteria that are to be executed for eager loading.
|
232
|
+
#
|
233
|
+
# @example Get the eager loading inclusions.
|
234
|
+
# Person.includes(:game).inclusions
|
235
|
+
#
|
236
|
+
# @return [ Array<Metadata> ] The inclusions.
|
237
|
+
#
|
238
|
+
# @since 2.2.0
|
239
|
+
def inclusions
|
240
|
+
@inclusions ||= []
|
241
|
+
end
|
242
|
+
|
243
|
+
# Set the inclusions for the criteria.
|
244
|
+
#
|
245
|
+
# @example Set the inclusions.
|
246
|
+
# criteria.inclusions = [ meta ]
|
247
|
+
#
|
248
|
+
# @param [ Array<Metadata> ] The inclusions.
|
249
|
+
#
|
250
|
+
# @return [ Array<Metadata> ] The new inclusions.
|
251
|
+
#
|
252
|
+
# @since 3.0.0
|
253
|
+
def inclusions=(value)
|
254
|
+
@inclusions = value
|
255
|
+
end
|
256
|
+
|
257
|
+
# Merges another object with this +Criteria+ and returns a new criteria.
|
258
|
+
# The other object may be a +Criteria+ or a +Hash+. This is used to
|
259
|
+
# combine multiple scopes together, where a chained scope situation
|
260
|
+
# may be desired.
|
261
|
+
#
|
262
|
+
# @example Merge the criteria with another criteria.
|
263
|
+
# criteri.merge(other_criteria)
|
264
|
+
#
|
265
|
+
# @example Merge the criteria with a hash. The hash must contain a klass
|
266
|
+
# key and the key/value pairs correspond to method names/args.
|
267
|
+
|
268
|
+
# criteria.merge({
|
269
|
+
# klass: Band,
|
270
|
+
# where: { name: "Depeche Mode" },
|
271
|
+
# order_by: { name: 1 }
|
272
|
+
# })
|
273
|
+
#
|
274
|
+
# @param [ Criteria ] other The other criterion to merge with.
|
275
|
+
#
|
276
|
+
# @return [ Criteria ] A cloned self.
|
277
|
+
def merge(other)
|
278
|
+
crit = clone
|
279
|
+
crit.merge!(other)
|
280
|
+
crit
|
281
|
+
end
|
282
|
+
|
283
|
+
# Merge the other criteria into this one.
|
284
|
+
#
|
285
|
+
# @example Merge another criteria into this criteria.
|
286
|
+
# criteria.merge(Person.where(name: "bob"))
|
287
|
+
#
|
288
|
+
# @param [ Criteria ] other The criteria to merge in.
|
289
|
+
#
|
290
|
+
# @return [ Criteria ] The merged criteria.
|
291
|
+
#
|
292
|
+
# @since 3.0.0
|
293
|
+
def merge!(other)
|
294
|
+
criteria = other.to_criteria
|
295
|
+
selector.merge!(criteria.selector)
|
296
|
+
options.merge!(criteria.options)
|
297
|
+
self.documents = criteria.documents.dup unless criteria.documents.empty?
|
298
|
+
self.scoping_options = criteria.scoping_options
|
299
|
+
self.inclusions = (inclusions + criteria.inclusions.dup).uniq
|
300
|
+
self
|
301
|
+
end
|
302
|
+
|
303
|
+
# Overriden to include _type in the fields.
|
304
|
+
#
|
305
|
+
# @example Limit the fields returned from the database.
|
306
|
+
# Band.only(:name)
|
307
|
+
#
|
308
|
+
# @param [ Array<Symbol> ] args The names of the fields.
|
309
|
+
#
|
310
|
+
# @return [ Criteria ] The cloned criteria.
|
311
|
+
#
|
312
|
+
# @since 1.0.0
|
313
|
+
def only(*args)
|
314
|
+
return clone if args.flatten.empty?
|
315
|
+
args = args.flatten
|
316
|
+
if klass.hereditary?
|
317
|
+
super(*args.push(:_type))
|
318
|
+
else
|
319
|
+
super(*args)
|
320
|
+
end
|
321
|
+
end
|
322
|
+
|
323
|
+
# Returns true if criteria responds to the given method.
|
324
|
+
#
|
325
|
+
# @example Does the criteria respond to the method?
|
326
|
+
# crtiteria.respond_to?(:each)
|
327
|
+
#
|
328
|
+
# @param [ Symbol ] name The name of the class method on the +Document+.
|
329
|
+
# @param [ true, false ] include_private Whether to include privates.
|
330
|
+
#
|
331
|
+
# @return [ true, false ] If the criteria responds to the method.
|
332
|
+
def respond_to?(name, include_private = false)
|
333
|
+
super || klass.respond_to?(name) || CHECK.respond_to?(name, include_private)
|
334
|
+
end
|
335
|
+
|
336
|
+
alias :to_ary :to_a
|
337
|
+
|
338
|
+
# Convenience for objects that want to be merged into a criteria.
|
339
|
+
#
|
340
|
+
# @example Convert to a criteria.
|
341
|
+
# criteria.to_criteria
|
342
|
+
#
|
343
|
+
# @return [ Criteria ] self.
|
344
|
+
#
|
345
|
+
# @since 3.0.0
|
346
|
+
def to_criteria
|
347
|
+
self
|
348
|
+
end
|
349
|
+
|
350
|
+
# Convert the criteria to a proc.
|
351
|
+
#
|
352
|
+
# @example Convert the criteria to a proc.
|
353
|
+
# criteria.to_proc
|
354
|
+
#
|
355
|
+
# @return [ Proc ] The wrapped criteria.
|
356
|
+
#
|
357
|
+
# @since 3.0.0
|
358
|
+
def to_proc
|
359
|
+
->{ self }
|
360
|
+
end
|
361
|
+
|
362
|
+
# Adds a criterion to the +Criteria+ that specifies a type or an Array of
|
363
|
+
# types that must be matched.
|
364
|
+
#
|
365
|
+
# @example Match only specific models.
|
366
|
+
# criteria.type('Browser')
|
367
|
+
# criteria.type(['Firefox', 'Browser'])
|
368
|
+
#
|
369
|
+
# @param [ Array<String> ] types The types to match against.
|
370
|
+
#
|
371
|
+
# @return [ Criteria ] The cloned criteria.
|
372
|
+
def type(types)
|
373
|
+
any_in(_type: Array(types))
|
374
|
+
end
|
375
|
+
|
376
|
+
# This is the general entry point for most MongoDB queries. This either
|
377
|
+
# creates a standard field: value selection, and expanded selection with
|
378
|
+
# the use of hash methods, or a $where selection if a string is provided.
|
379
|
+
#
|
380
|
+
# @example Add a standard selection.
|
381
|
+
# criteria.where(name: "syd")
|
382
|
+
#
|
383
|
+
# @example Add a javascript selection.
|
384
|
+
# criteria.where("this.name == 'syd'")
|
385
|
+
#
|
386
|
+
# @param [ String, Hash ] criterion The javascript or standard selection.
|
387
|
+
#
|
388
|
+
# @raise [ UnsupportedJavascript ] If provided a string and the criteria
|
389
|
+
# is embedded.
|
390
|
+
#
|
391
|
+
# @return [ Criteria ] The cloned selectable.
|
392
|
+
#
|
393
|
+
# @since 1.0.0
|
394
|
+
def where(expression)
|
395
|
+
if expression.is_a?(::String) && embedded?
|
396
|
+
raise Errors::UnsupportedJavascript.new(klass, expression)
|
397
|
+
end
|
398
|
+
super
|
399
|
+
end
|
400
|
+
|
401
|
+
|
402
|
+
# Get a version of this criteria without the options.
|
403
|
+
#
|
404
|
+
# @example Get the criteria without options.
|
405
|
+
# criteria.without_options
|
406
|
+
#
|
407
|
+
# @return [ Criteria ] The cloned criteria.
|
408
|
+
#
|
409
|
+
# @since 3.0.4
|
410
|
+
def without_options
|
411
|
+
crit = clone
|
412
|
+
crit.options.clear
|
413
|
+
crit
|
414
|
+
end
|
415
|
+
|
416
|
+
# Find documents by the provided javascript and scope. Uses a $where but is
|
417
|
+
# different from +Criteria#where+ in that it will pass a code object to the
|
418
|
+
# query instead of a pure string. Safe against Javascript injection
|
419
|
+
# attacks.
|
420
|
+
#
|
421
|
+
# @example Find by javascript.
|
422
|
+
# Band.for_js("this.name = param", param: "Tool")
|
423
|
+
#
|
424
|
+
# @param [ String ] javascript The javascript to execute in the $where.
|
425
|
+
# @param [ Hash ] scope The scope for the code.
|
426
|
+
#
|
427
|
+
# @return [ Criteria ] The criteria.
|
428
|
+
#
|
429
|
+
# @since 3.1.0
|
430
|
+
def for_js(javascript, scope = {})
|
431
|
+
js_query(Moped::BSON::Code.new(javascript, scope))
|
432
|
+
end
|
433
|
+
|
434
|
+
private
|
435
|
+
|
436
|
+
# Are documents in the query missing, and are we configured to raise an
|
437
|
+
# error?
|
438
|
+
#
|
439
|
+
# @api private
|
440
|
+
#
|
441
|
+
# @example Check for missing documents.
|
442
|
+
# criteria.check_for_missing_documents!([], [ 1 ])
|
443
|
+
#
|
444
|
+
# @param [ Array<Document> ] result The result.
|
445
|
+
# @param [ Array<Object> ] ids The ids.
|
446
|
+
#
|
447
|
+
# @raise [ Errors::DocumentNotFound ] If none are found and raising an
|
448
|
+
# error.
|
449
|
+
#
|
450
|
+
# @since 3.0.0
|
451
|
+
def check_for_missing_documents!(result, ids)
|
452
|
+
if (result.size < ids.size) && Mongoid.raise_not_found_error
|
453
|
+
raise Errors::DocumentNotFound.new(klass, ids, ids - result.map(&:_id))
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
# Clone or dup the current +Criteria+. This will return a new criteria with
|
458
|
+
# the selector, options, klass, embedded options, etc intact.
|
459
|
+
#
|
460
|
+
# @api private
|
461
|
+
#
|
462
|
+
# @example Clone a criteria.
|
463
|
+
# criteria.clone
|
464
|
+
#
|
465
|
+
# @example Dup a criteria.
|
466
|
+
# criteria.dup
|
467
|
+
#
|
468
|
+
# @param [ Criteria ] other The criteria getting cloned.
|
469
|
+
#
|
470
|
+
# @return [ nil ] nil.
|
471
|
+
#
|
472
|
+
# @since 1.0.0
|
473
|
+
def initialize_copy(other)
|
474
|
+
@inclusions = other.inclusions.dup
|
475
|
+
@scoping_options = other.scoping_options
|
476
|
+
@documents = other.documents.dup
|
477
|
+
@context = nil
|
478
|
+
super
|
479
|
+
end
|
480
|
+
|
481
|
+
# Used for chaining +Criteria+ scopes together in the for of class methods
|
482
|
+
# on the +Document+ the criteria is for.
|
483
|
+
#
|
484
|
+
# @example Handle method missing.
|
485
|
+
# criteria.method_missing(:name)
|
486
|
+
#
|
487
|
+
# @param [ Symbol ] name The method name.
|
488
|
+
# @param [ Array ] args The arguments.
|
489
|
+
#
|
490
|
+
# @return [ Object ] The result of the method call.
|
491
|
+
#
|
492
|
+
# @since 1.0.0
|
493
|
+
def method_missing(name, *args, &block)
|
494
|
+
if klass.respond_to?(name)
|
495
|
+
klass.send(:with_scope, self) do
|
496
|
+
klass.send(name, *args, &block)
|
497
|
+
end
|
498
|
+
elsif CHECK.respond_to?(name)
|
499
|
+
return entries.send(name, *args, &block)
|
500
|
+
else
|
501
|
+
super
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
# For models where inheritance is at play we need to add the type
|
506
|
+
# selection.
|
507
|
+
#
|
508
|
+
# @example Add the type selection.
|
509
|
+
# criteria.merge_type_selection
|
510
|
+
#
|
511
|
+
# @return [ true, false ] If type selection was added.
|
512
|
+
#
|
513
|
+
# @since 3.0.3
|
514
|
+
def merge_type_selection
|
515
|
+
selector.merge!(type_selection) if type_selectable?
|
516
|
+
end
|
517
|
+
|
518
|
+
# Is the criteria type selectable?
|
519
|
+
#
|
520
|
+
# @api private
|
521
|
+
#
|
522
|
+
# @example If the criteria type selectable?
|
523
|
+
# criteria.type_selectable?
|
524
|
+
#
|
525
|
+
# @return [ true, false ] If type selection should be added.
|
526
|
+
#
|
527
|
+
# @since 3.0.3
|
528
|
+
def type_selectable?
|
529
|
+
klass.hereditary? &&
|
530
|
+
!selector.keys.include?("_type") &&
|
531
|
+
!selector.keys.include?(:_type)
|
532
|
+
end
|
533
|
+
|
534
|
+
# Get the selector for type selection.
|
535
|
+
#
|
536
|
+
# @api private
|
537
|
+
#
|
538
|
+
# @example Get a type selection hash.
|
539
|
+
# criteria.type_selection
|
540
|
+
#
|
541
|
+
# @return [ Hash ] The type selection.
|
542
|
+
#
|
543
|
+
# @since 3.0.3
|
544
|
+
def type_selection
|
545
|
+
{ _type: { "$in" => klass._types }}
|
546
|
+
end
|
547
|
+
|
548
|
+
# Get a new selector with type selection in it.
|
549
|
+
#
|
550
|
+
# @api private
|
551
|
+
#
|
552
|
+
# @example Get a selector with type selection.
|
553
|
+
# criteria.selector_with_type_selection
|
554
|
+
#
|
555
|
+
# @return [ Hash ] The selector.
|
556
|
+
#
|
557
|
+
# @since 3.0.3
|
558
|
+
def selector_with_type_selection
|
559
|
+
type_selectable? ? selector.merge(type_selection) : selector
|
560
|
+
end
|
561
|
+
end
|
562
|
+
end
|