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,94 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Touchable
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
# Touch the document, in effect updating its updated_at timestamp and
|
8
|
+
# optionally the provided field to the current time. If any belongs_to
|
9
|
+
# relations exist with a touch option, they will be updated as well.
|
10
|
+
#
|
11
|
+
# @example Update the updated_at timestamp.
|
12
|
+
# document.touch
|
13
|
+
#
|
14
|
+
# @example Update the updated_at and provided timestamps.
|
15
|
+
# document.touch(:audited)
|
16
|
+
#
|
17
|
+
# @note This will not autobuild relations if those options are set.
|
18
|
+
#
|
19
|
+
# @param [ Symbol ] field The name of an additional field to update.
|
20
|
+
#
|
21
|
+
# @return [ true/false ] false if record is new_record otherwise true.
|
22
|
+
#
|
23
|
+
# @since 3.0.0
|
24
|
+
def touch(field = nil)
|
25
|
+
return false if _root.new_record?
|
26
|
+
current = Time.now
|
27
|
+
field = database_field_name(field)
|
28
|
+
write_attribute(:updated_at, current) if respond_to?("updated_at=")
|
29
|
+
write_attribute(field, current) if field
|
30
|
+
|
31
|
+
touches = touch_atomic_updates(field)
|
32
|
+
unless touches.empty?
|
33
|
+
selector = atomic_selector
|
34
|
+
_root.collection.find(selector).update(positionally(selector, touches))
|
35
|
+
end
|
36
|
+
run_callbacks(:touch)
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
module ClassMethods
|
41
|
+
|
42
|
+
# Add the metadata to the touchable relations if the touch option was
|
43
|
+
# provided.
|
44
|
+
#
|
45
|
+
# @example Add the touchable.
|
46
|
+
# Model.touchable(meta)
|
47
|
+
#
|
48
|
+
# @param [ Metadata ] metadata The relation metadata.
|
49
|
+
#
|
50
|
+
# @return [ Class ] The model class.
|
51
|
+
#
|
52
|
+
# @since 3.0.0
|
53
|
+
def touchable(metadata)
|
54
|
+
if metadata.touchable?
|
55
|
+
name = metadata.name
|
56
|
+
method_name = define_relation_touch_method(name)
|
57
|
+
after_create method_name
|
58
|
+
after_destroy method_name
|
59
|
+
after_touch method_name
|
60
|
+
end
|
61
|
+
self
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
# Define the method that will get called for touching belongs_to
|
67
|
+
# relations.
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
#
|
71
|
+
# @example Define the touch relation.
|
72
|
+
# Model.define_relation_touch_method(:band)
|
73
|
+
#
|
74
|
+
# @param [ Symbol ] name The name of the relation.
|
75
|
+
#
|
76
|
+
# @since 3.1.0
|
77
|
+
#
|
78
|
+
# @return [ Symbol ] The method name.
|
79
|
+
def define_relation_touch_method(name)
|
80
|
+
method_name = "touch_#{name}_after_create_or_destroy"
|
81
|
+
class_eval <<-TOUCH
|
82
|
+
def #{method_name}
|
83
|
+
without_autobuild do
|
84
|
+
relation = __send__(:#{name})
|
85
|
+
relation.touch if relation
|
86
|
+
end
|
87
|
+
end
|
88
|
+
TOUCH
|
89
|
+
method_name.to_sym
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module handles reloading behaviour of documents.
|
5
|
+
#
|
6
|
+
# @since 4.0.0
|
7
|
+
module Reloadable
|
8
|
+
|
9
|
+
# Reloads the +Document+ attributes from the database. If the document has
|
10
|
+
# not been saved then an error will get raised if the configuration option
|
11
|
+
# was set. This can reload root documents or embedded documents.
|
12
|
+
#
|
13
|
+
# @example Reload the document.
|
14
|
+
# person.reload
|
15
|
+
#
|
16
|
+
# @raise [ Errors::DocumentNotFound ] If the document was deleted.
|
17
|
+
#
|
18
|
+
# @return [ Document ] The document, reloaded.
|
19
|
+
#
|
20
|
+
# @since 1.0.0
|
21
|
+
def reload
|
22
|
+
reloaded = _reload
|
23
|
+
if Mongoid.raise_not_found_error && reloaded.empty?
|
24
|
+
raise Errors::DocumentNotFound.new(self.class, id, id)
|
25
|
+
end
|
26
|
+
@attributes = reloaded
|
27
|
+
@attributes_before_type_cast = {}
|
28
|
+
changed_attributes.clear
|
29
|
+
apply_defaults
|
30
|
+
reload_relations
|
31
|
+
IdentityMap.set(self)
|
32
|
+
run_callbacks(:find) unless _find_callbacks.empty?
|
33
|
+
run_callbacks(:initialize) unless _initialize_callbacks.empty?
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# Reload the document, determining if it's embedded or not and what
|
40
|
+
# behaviour to use.
|
41
|
+
#
|
42
|
+
# @example Reload the document.
|
43
|
+
# document._reload
|
44
|
+
#
|
45
|
+
# @return [ Hash ] The reloaded attributes.
|
46
|
+
#
|
47
|
+
# @since 2.3.2
|
48
|
+
def _reload
|
49
|
+
embedded? ? reload_embedded_document : reload_root_document
|
50
|
+
end
|
51
|
+
|
52
|
+
# Reload the root document.
|
53
|
+
#
|
54
|
+
# @example Reload the document.
|
55
|
+
# document.reload_root_document
|
56
|
+
#
|
57
|
+
# @return [ Hash ] The reloaded attributes.
|
58
|
+
#
|
59
|
+
# @since 2.3.2
|
60
|
+
def reload_root_document
|
61
|
+
{}.merge(with(consistency: :strong).collection.find(_id: id).one || {})
|
62
|
+
end
|
63
|
+
|
64
|
+
# Reload the embedded document.
|
65
|
+
#
|
66
|
+
# @example Reload the document.
|
67
|
+
# document.reload_embedded_document
|
68
|
+
#
|
69
|
+
# @return [ Hash ] The reloaded attributes.
|
70
|
+
#
|
71
|
+
# @since 2.3.2
|
72
|
+
def reload_embedded_document
|
73
|
+
extract_embedded_attributes({}.merge(
|
74
|
+
_root.with(consistency: :strong).collection.find(_id: _root.id).one
|
75
|
+
))
|
76
|
+
end
|
77
|
+
|
78
|
+
# Extract only the desired embedded document from the attributes.
|
79
|
+
#
|
80
|
+
# @example Extract the embedded document.
|
81
|
+
# document.extract_embedded_attributes(attributes)
|
82
|
+
#
|
83
|
+
# @param [ Hash ] attributes The document in the db.
|
84
|
+
#
|
85
|
+
# @return [ Hash ] The document's extracted attributes.
|
86
|
+
#
|
87
|
+
# @since 2.3.2
|
88
|
+
def extract_embedded_attributes(attributes)
|
89
|
+
atomic_position.split(".").inject(attributes) do |attrs, part|
|
90
|
+
attrs = attrs[part =~ /\d/ ? part.to_i : part]
|
91
|
+
attrs
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,379 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module contains behaviour for all Mongoid scoping - named scopes,
|
5
|
+
# default scopes, and criteria accessors via scoped and unscoped.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Scopable
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
class_attribute :default_scoping
|
13
|
+
class_attribute :_declared_scopes
|
14
|
+
self._declared_scopes = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# Apply the default scoping to the attributes of the document, as long as
|
20
|
+
# they are not complex queries.
|
21
|
+
#
|
22
|
+
# @api private
|
23
|
+
#
|
24
|
+
# @example Apply the default scoping.
|
25
|
+
# document.apply_default_scoping
|
26
|
+
#
|
27
|
+
# @return [ true, false ] If default scoping was applied.
|
28
|
+
#
|
29
|
+
# @since 4.0.0
|
30
|
+
def apply_default_scoping
|
31
|
+
if default_scoping
|
32
|
+
default_scoping.call.selector.each do |field, value|
|
33
|
+
attributes[field] = value unless value.respond_to?(:each_pair)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module ClassMethods
|
39
|
+
|
40
|
+
# Returns a hash of all the scopes defined for this class, including
|
41
|
+
# scopes defined on ancestor classes.
|
42
|
+
#
|
43
|
+
# @example Get the defined scopes for a class
|
44
|
+
# class Band
|
45
|
+
# include Mongoid::Document
|
46
|
+
# field :active, type: Boolean
|
47
|
+
#
|
48
|
+
# scope :active, where(active: true)
|
49
|
+
# end
|
50
|
+
# Band.scopes
|
51
|
+
#
|
52
|
+
# @return [ Hash ] The scopes defined for this class
|
53
|
+
#
|
54
|
+
# @since 3.1.4
|
55
|
+
def scopes
|
56
|
+
defined_scopes = {}
|
57
|
+
ancestors.reverse.each do |klass|
|
58
|
+
if klass.respond_to?(:_declared_scopes)
|
59
|
+
defined_scopes.merge!(klass._declared_scopes)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
defined_scopes.freeze
|
63
|
+
end
|
64
|
+
|
65
|
+
# Add a default scope to the model. This scope will be applied to all
|
66
|
+
# criteria unless #unscoped is specified.
|
67
|
+
#
|
68
|
+
# @example Define a default scope with a criteria.
|
69
|
+
# class Band
|
70
|
+
# include Mongoid::Document
|
71
|
+
# field :active, type: Boolean
|
72
|
+
# default_scope where(active: true)
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# @example Define a default scope with a proc.
|
76
|
+
# class Band
|
77
|
+
# include Mongoid::Document
|
78
|
+
# field :active, type: Boolean
|
79
|
+
# default_scope ->{ where(active: true) }
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# @param [ Proc, Criteria ] scope The default scope.
|
83
|
+
#
|
84
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
|
85
|
+
#
|
86
|
+
# @return [ Proc ] The default scope.
|
87
|
+
#
|
88
|
+
# @since 1.0.0
|
89
|
+
def default_scope(value)
|
90
|
+
check_scope_validity(value)
|
91
|
+
self.default_scoping = process_default_scope(value)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Is the class able to have the default scope applied?
|
95
|
+
#
|
96
|
+
# @example Can the default scope be applied?
|
97
|
+
# Band.default_scopable?
|
98
|
+
#
|
99
|
+
# @return [ true, false ] If the default scope can be applied.
|
100
|
+
#
|
101
|
+
# @since 3.0.0
|
102
|
+
def default_scopable?
|
103
|
+
default_scoping? && !Threaded.executing?(:without_default_scope)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Get a queryable, either the last one on the scope stack or a fresh one.
|
107
|
+
#
|
108
|
+
# @api private
|
109
|
+
#
|
110
|
+
# @example Get a queryable.
|
111
|
+
# Model.queryable
|
112
|
+
#
|
113
|
+
# @return [ Criteria ] The queryable.
|
114
|
+
#
|
115
|
+
# @since 3.0.0
|
116
|
+
def queryable
|
117
|
+
scope_stack.last || Criteria.new(self)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Create a scope that can be accessed from the class level or chained to
|
121
|
+
# criteria by the provided name.
|
122
|
+
#
|
123
|
+
# @example Create named scopes.
|
124
|
+
#
|
125
|
+
# class Person
|
126
|
+
# include Mongoid::Document
|
127
|
+
# field :active, type: Boolean
|
128
|
+
# field :count, type: Integer
|
129
|
+
#
|
130
|
+
# scope :active, where(active: true)
|
131
|
+
# scope :at_least, ->(count){ where(:count.gt => count) }
|
132
|
+
# end
|
133
|
+
#
|
134
|
+
# @param [ Symbol ] name The name of the scope.
|
135
|
+
# @param [ Proc, Criteria ] conditions The conditions of the scope.
|
136
|
+
#
|
137
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a proc or criteria.
|
138
|
+
# @raise [ Errors::ScopeOverwrite ] If the scope name already exists.
|
139
|
+
#
|
140
|
+
# @since 1.0.0
|
141
|
+
def scope(name, value, &block)
|
142
|
+
normalized = name.to_sym
|
143
|
+
check_scope_validity(value)
|
144
|
+
check_scope_name(normalized)
|
145
|
+
_declared_scopes[normalized] = {
|
146
|
+
scope: strip_default_scope(value),
|
147
|
+
extension: Module.new(&block)
|
148
|
+
}
|
149
|
+
define_scope_method(normalized)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Initializes and returns the current scope stack.
|
153
|
+
#
|
154
|
+
# @example Get the scope stack.
|
155
|
+
# Person.scope_stack
|
156
|
+
#
|
157
|
+
# @return [ Array<Criteria> ] The scope stack.
|
158
|
+
#
|
159
|
+
# @since 1.0.0
|
160
|
+
def scope_stack
|
161
|
+
Threaded.scope_stack[object_id] ||= []
|
162
|
+
end
|
163
|
+
|
164
|
+
# Get a criteria for the document with normal scoping.
|
165
|
+
#
|
166
|
+
# @example Get the criteria.
|
167
|
+
# Band.scoped(skip: 10)
|
168
|
+
#
|
169
|
+
# @note This will force the default scope to be applied.
|
170
|
+
#
|
171
|
+
# @param [ Hash ] options Query options for the criteria.
|
172
|
+
#
|
173
|
+
# @option options [ Integer ] :skip Optional number of documents to skip.
|
174
|
+
# @option options [ Integer ] :limit Optional number of documents to
|
175
|
+
# limit.
|
176
|
+
# @option options [ Array ] :sort Optional sorting options.
|
177
|
+
#
|
178
|
+
# @return [ Criteria ] A scoped criteria.
|
179
|
+
#
|
180
|
+
# @since 3.0.0
|
181
|
+
def scoped(options = nil)
|
182
|
+
queryable.scoped(options)
|
183
|
+
end
|
184
|
+
|
185
|
+
# Get the criteria without the default scoping applied.
|
186
|
+
#
|
187
|
+
# @example Get the unscoped criteria.
|
188
|
+
# Band.unscoped
|
189
|
+
#
|
190
|
+
# @example Yield to block with no default scoping.
|
191
|
+
# Band.unscoped do
|
192
|
+
# Band.where(name: "Depeche Mode")
|
193
|
+
# end
|
194
|
+
#
|
195
|
+
# @note This will force the default scope to be removed.
|
196
|
+
#
|
197
|
+
# @return [ Criteria, Object ] The unscoped criteria or result of the
|
198
|
+
# block.
|
199
|
+
#
|
200
|
+
# @since 3.0.0
|
201
|
+
def unscoped
|
202
|
+
if block_given?
|
203
|
+
without_default_scope do
|
204
|
+
yield(self)
|
205
|
+
end
|
206
|
+
else
|
207
|
+
queryable.unscoped
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
# Get a criteria with the default scope applied, if possible.
|
212
|
+
#
|
213
|
+
# @example Get a criteria with the default scope.
|
214
|
+
# Model.with_default_scope
|
215
|
+
#
|
216
|
+
# @return [ Criteria ] The criteria.
|
217
|
+
#
|
218
|
+
# @since 3.0.0
|
219
|
+
def with_default_scope
|
220
|
+
queryable.with_default_scope
|
221
|
+
end
|
222
|
+
alias :criteria :with_default_scope
|
223
|
+
|
224
|
+
# Pushes the provided criteria onto the scope stack, and removes it after the
|
225
|
+
# provided block is yielded.
|
226
|
+
#
|
227
|
+
# @example Yield to the criteria.
|
228
|
+
# Person.with_scope(criteria)
|
229
|
+
#
|
230
|
+
# @param [ Criteria ] criteria The criteria to apply.
|
231
|
+
#
|
232
|
+
# @return [ Criteria ] The yielded criteria.
|
233
|
+
#
|
234
|
+
# @since 1.0.0
|
235
|
+
def with_scope(criteria)
|
236
|
+
scope_stack.push(criteria)
|
237
|
+
begin
|
238
|
+
yield criteria
|
239
|
+
ensure
|
240
|
+
scope_stack.pop
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
# Execute the block without applying the default scope.
|
245
|
+
#
|
246
|
+
# @example Execute without the default scope.
|
247
|
+
# Band.without_default_scope do
|
248
|
+
# Band.where(name: "Depeche Mode")
|
249
|
+
# end
|
250
|
+
#
|
251
|
+
# @return [ Object ] The result of the block.
|
252
|
+
#
|
253
|
+
# @since 3.0.0
|
254
|
+
def without_default_scope
|
255
|
+
Threaded.begin_execution("without_default_scope")
|
256
|
+
yield
|
257
|
+
ensure
|
258
|
+
Threaded.exit_execution("without_default_scope")
|
259
|
+
end
|
260
|
+
|
261
|
+
private
|
262
|
+
|
263
|
+
# Warns or raises exception if overriding another scope or method.
|
264
|
+
#
|
265
|
+
# @api private
|
266
|
+
#
|
267
|
+
# @example Warn or raise error if name exists.
|
268
|
+
# Model.valid_scope_name?("test")
|
269
|
+
#
|
270
|
+
# @param [ String, Symbol ] name The name of the scope.
|
271
|
+
#
|
272
|
+
# @raise [ Errors::ScopeOverwrite ] If the name exists and configured to
|
273
|
+
# raise the error.
|
274
|
+
#
|
275
|
+
# @since 2.1.0
|
276
|
+
def check_scope_name(name)
|
277
|
+
if _declared_scopes[name] || respond_to?(name, true)
|
278
|
+
if Mongoid.scope_overwrite_exception
|
279
|
+
raise Errors::ScopeOverwrite.new(self.name, name)
|
280
|
+
else
|
281
|
+
if Mongoid.logger
|
282
|
+
Mongoid.logger.warn(
|
283
|
+
"Creating scope :#{name}. " +
|
284
|
+
"Overwriting existing method #{self.name}.#{name}."
|
285
|
+
)
|
286
|
+
end
|
287
|
+
end
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
# Checks if the intended scope is a valid object, either a criteria or
|
292
|
+
# proc with a criteria.
|
293
|
+
#
|
294
|
+
# @api private
|
295
|
+
#
|
296
|
+
# @example Check if the scope is valid.
|
297
|
+
# Model.check_scope_validity({})
|
298
|
+
#
|
299
|
+
# @param [ Object ] value The intended scope.
|
300
|
+
#
|
301
|
+
# @raise [ Errors::InvalidScope ] If the scope is not a valid object.
|
302
|
+
#
|
303
|
+
# @since 3.0.0
|
304
|
+
def check_scope_validity(value)
|
305
|
+
unless value.respond_to?(:to_proc)
|
306
|
+
raise Errors::InvalidScope.new(self, value)
|
307
|
+
end
|
308
|
+
end
|
309
|
+
|
310
|
+
# Defines the actual class method that will execute the scope when
|
311
|
+
# called.
|
312
|
+
#
|
313
|
+
# @api private
|
314
|
+
#
|
315
|
+
# @example Define the scope class method.
|
316
|
+
# Model.define_scope_method(:active)
|
317
|
+
#
|
318
|
+
# @param [ Symbol ] name The method/scope name.
|
319
|
+
#
|
320
|
+
# @return [ Method ] The defined method.
|
321
|
+
#
|
322
|
+
# @since 3.0.0
|
323
|
+
def define_scope_method(name)
|
324
|
+
singleton_class.class_eval <<-SCOPE, __FILE__, __LINE__ + 1
|
325
|
+
def #{name}(*args)
|
326
|
+
scoping = _declared_scopes[:#{name}]
|
327
|
+
scope, extension = scoping[:scope][*args], scoping[:extension]
|
328
|
+
criteria = with_default_scope.merge(scope || queryable)
|
329
|
+
criteria.extend(extension)
|
330
|
+
criteria
|
331
|
+
end
|
332
|
+
SCOPE
|
333
|
+
end
|
334
|
+
|
335
|
+
# Process the default scope value. If one already exists, we merge the
|
336
|
+
# new one into the old one.
|
337
|
+
#
|
338
|
+
# @api private
|
339
|
+
#
|
340
|
+
# @example Process the default scope.
|
341
|
+
# Model.process_default_scope(value)
|
342
|
+
#
|
343
|
+
# @param [ Criteria, Proc ] value The default scope value.
|
344
|
+
#
|
345
|
+
# @since 3.0.5
|
346
|
+
def process_default_scope(value)
|
347
|
+
if existing = default_scoping
|
348
|
+
->{ existing.call.merge(value.to_proc.call) }
|
349
|
+
else
|
350
|
+
value.to_proc
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
# Strip the default scope from the provided value, if it is a criteria.
|
355
|
+
# This is used by named scopes - they should not have the default scoping
|
356
|
+
# applied to them.
|
357
|
+
#
|
358
|
+
# @api private
|
359
|
+
#
|
360
|
+
# @example Strip the default scope.
|
361
|
+
# Model.strip_default_scope
|
362
|
+
#
|
363
|
+
# @param [ Proc, Criteria ] value The value to strip from.
|
364
|
+
#
|
365
|
+
# @return [ Proc ] The stripped criteria, as a proc.
|
366
|
+
#
|
367
|
+
# @since 3.0.0
|
368
|
+
def strip_default_scope(value)
|
369
|
+
if value.is_a?(Criteria)
|
370
|
+
default = default_scoping.try(:call)
|
371
|
+
value.remove_scoping(default)
|
372
|
+
value.to_proc
|
373
|
+
else
|
374
|
+
value
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|