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,52 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Persistable
|
4
|
+
|
5
|
+
# Defines behaviour for persistence operations that save documents.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Savable
|
9
|
+
|
10
|
+
# Save the document - will perform an insert if the document is new, and
|
11
|
+
# update if not.
|
12
|
+
#
|
13
|
+
# @example Save the document.
|
14
|
+
# document.save
|
15
|
+
#
|
16
|
+
# @param [ Hash ] options Options to pass to the save.
|
17
|
+
#
|
18
|
+
# @return [ true, false ] True is success, false if not.
|
19
|
+
#
|
20
|
+
# @since 1.0.0
|
21
|
+
def save(options = {})
|
22
|
+
if new_record?
|
23
|
+
!insert(options).new_record?
|
24
|
+
else
|
25
|
+
update_document(options)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Save the document - will perform an insert if the document is new, and
|
30
|
+
# update if not. If a validation error occurs an error will get raised.
|
31
|
+
#
|
32
|
+
# @example Save the document.
|
33
|
+
# document.save!
|
34
|
+
#
|
35
|
+
# @param [ Hash ] options Options to pass to the save.
|
36
|
+
#
|
37
|
+
# @raise [ Errors::Validations ] If validation failed.
|
38
|
+
# @raise [ Errors::Callback ] If a callback returns false.
|
39
|
+
#
|
40
|
+
# @return [ true, false ] True if validation passed.
|
41
|
+
#
|
42
|
+
# @since 1.0.0
|
43
|
+
def save!(options = {})
|
44
|
+
unless save(options)
|
45
|
+
fail_due_to_validation! unless errors.empty?
|
46
|
+
fail_due_to_callback!(:save!)
|
47
|
+
end
|
48
|
+
true
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Persistable
|
4
|
+
|
5
|
+
# Defines behaviour for $set operations.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Settable
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
# Perform a $set operation on the provided field/value pairs and set the
|
12
|
+
# values in the document in memory.
|
13
|
+
#
|
14
|
+
# @example Set the values.
|
15
|
+
# document.set(title: "sir", dob: Date.new(1970, 1, 1))
|
16
|
+
#
|
17
|
+
# @param [ Hash ] setters The field/value pairs to set.
|
18
|
+
#
|
19
|
+
# @return [ true ] If the operation succeeded.
|
20
|
+
#
|
21
|
+
# @since 4.0.0
|
22
|
+
def set(setters)
|
23
|
+
prepare_atomic_operation do |ops|
|
24
|
+
process_atomic_operations(setters) do |field, value|
|
25
|
+
send("#{field}=", value)
|
26
|
+
ops[atomic_attribute_name(field)] = attributes[field]
|
27
|
+
end
|
28
|
+
{ "$set" => ops }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Persistable
|
4
|
+
|
5
|
+
# Defines behaviour for $unset operations.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Unsettable
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
# Perform an $unset operation on the provided fields and in the
|
12
|
+
# values in the document in memory.
|
13
|
+
#
|
14
|
+
# @example Unset the values.
|
15
|
+
# document.unset(:first_name, :last_name, :middle)
|
16
|
+
#
|
17
|
+
# @param [ Array<String, Symbol> ] fields The names of the fields to
|
18
|
+
# unset.
|
19
|
+
#
|
20
|
+
# @return [ true ] If the operation succeeded.
|
21
|
+
#
|
22
|
+
# @since 4.0.0
|
23
|
+
def unset(*fields)
|
24
|
+
prepare_atomic_operation do |ops|
|
25
|
+
fields.flatten.each do |field|
|
26
|
+
normalized = database_field_name(field)
|
27
|
+
attributes.delete(normalized)
|
28
|
+
ops[atomic_attribute_name(normalized)] = true
|
29
|
+
end
|
30
|
+
{ "$unset" => ops }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -0,0 +1,151 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Persistable
|
4
|
+
|
5
|
+
# Defines behaviour for persistence operations that update existing
|
6
|
+
# documents.
|
7
|
+
#
|
8
|
+
# @since 4.0.0
|
9
|
+
module Updatable
|
10
|
+
|
11
|
+
# Update the document in the database.
|
12
|
+
#
|
13
|
+
# @example Update an existing document.
|
14
|
+
# document.update
|
15
|
+
#
|
16
|
+
# @param [ Hash ] options Options to pass to update.
|
17
|
+
#
|
18
|
+
# @option options [ true, false ] :validate Whether or not to validate.
|
19
|
+
#
|
20
|
+
# @return [ true, false ] True if succeeded, false if not.
|
21
|
+
#
|
22
|
+
# @since 1.0.0
|
23
|
+
def update_document(options = {})
|
24
|
+
prepare_update(options) do
|
25
|
+
updates, conflicts = init_atomic_updates
|
26
|
+
unless updates.empty?
|
27
|
+
coll = _root.collection
|
28
|
+
selector = atomic_selector
|
29
|
+
coll.find(selector).update(positionally(selector, updates))
|
30
|
+
conflicts.each_pair do |key, value|
|
31
|
+
coll.find(selector).update(positionally(selector, { key => value }))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Update a single attribute and persist the entire document.
|
38
|
+
# This skips validation but fires the callbacks.
|
39
|
+
#
|
40
|
+
# @example Update the attribute.
|
41
|
+
# person.update_attribute(:title, "Sir")
|
42
|
+
#
|
43
|
+
# @param [ Symbol, String ] name The name of the attribute.
|
44
|
+
# @param [ Object ] value The new value of the attribute.a
|
45
|
+
#
|
46
|
+
# @raise [ Errors::ReadonlyAttribute ] If the field cannot be changed due
|
47
|
+
# to being flagged as reaodnly.
|
48
|
+
#
|
49
|
+
# @return [ true, false ] True if save was successfull, false if not.
|
50
|
+
#
|
51
|
+
# @since 2.0.0
|
52
|
+
def update_attribute(name, value)
|
53
|
+
normalized = name.to_s
|
54
|
+
unless attribute_writable?(normalized)
|
55
|
+
raise Errors::ReadonlyAttribute.new(normalized, value)
|
56
|
+
end
|
57
|
+
setter = "#{normalized}="
|
58
|
+
if respond_to?(setter)
|
59
|
+
send(setter, value)
|
60
|
+
else
|
61
|
+
write_attribute(database_field_name(normalized), value)
|
62
|
+
end
|
63
|
+
save(validate: false)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Update the document attributes in the database.
|
67
|
+
#
|
68
|
+
# @example Update the document's attributes
|
69
|
+
# document.update(:title => "Sir")
|
70
|
+
#
|
71
|
+
# @param [ Hash ] attributes The attributes to update.
|
72
|
+
#
|
73
|
+
# @return [ true, false ] True if validation passed, false if not.
|
74
|
+
#
|
75
|
+
# @since 1.0.0
|
76
|
+
def update(attributes = {})
|
77
|
+
assign_attributes(attributes)
|
78
|
+
save
|
79
|
+
end
|
80
|
+
alias :update_attributes :update
|
81
|
+
|
82
|
+
# Update the document attributes in the database and raise an error if
|
83
|
+
# validation failed.
|
84
|
+
#
|
85
|
+
# @example Update the document's attributes.
|
86
|
+
# document.update!(:title => "Sir")
|
87
|
+
#
|
88
|
+
# @param [ Hash ] attributes The attributes to update.
|
89
|
+
#
|
90
|
+
# @raise [ Errors::Validations ] If validation failed.
|
91
|
+
# @raise [ Errors::Callbacks ] If a callback returns false.
|
92
|
+
#
|
93
|
+
# @return [ true, false ] True if validation passed.
|
94
|
+
#
|
95
|
+
# @since 1.0.0
|
96
|
+
def update!(attributes = {})
|
97
|
+
result = update_attributes(attributes)
|
98
|
+
unless result
|
99
|
+
fail_due_to_validation! unless errors.empty?
|
100
|
+
fail_due_to_callback!(:update_attributes!)
|
101
|
+
end
|
102
|
+
result
|
103
|
+
end
|
104
|
+
alias :update_attributes! :update!
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
# Initialize the atomic updates.
|
109
|
+
#
|
110
|
+
# @api private
|
111
|
+
#
|
112
|
+
# @example Initialize the atomic updates.
|
113
|
+
# document.init_atomic_updates
|
114
|
+
#
|
115
|
+
# @return [ Array<Hash> ] The updates and conflicts.
|
116
|
+
#
|
117
|
+
# @since 4.0.0
|
118
|
+
def init_atomic_updates
|
119
|
+
updates = atomic_updates
|
120
|
+
conflicts = updates.delete(:conflicts) || {}
|
121
|
+
[ updates, conflicts ]
|
122
|
+
end
|
123
|
+
|
124
|
+
# Prepare the update for execution. Validates and runs callbacks, etc.
|
125
|
+
#
|
126
|
+
# @api private
|
127
|
+
#
|
128
|
+
# @example Prepare for update.
|
129
|
+
# document.prepare_update do
|
130
|
+
# collection.update(atomic_selector)
|
131
|
+
# end
|
132
|
+
#
|
133
|
+
# @param [ Hash ] options The options.
|
134
|
+
#
|
135
|
+
# @return [ true, false ] The result of the update.
|
136
|
+
#
|
137
|
+
# @since 4.0.0
|
138
|
+
def prepare_update(options = {})
|
139
|
+
return false if performing_validations?(options) && invalid?(:update)
|
140
|
+
process_flagged_destroys
|
141
|
+
result = run_callbacks(:save) do
|
142
|
+
run_callbacks(:update) do
|
143
|
+
yield(self)
|
144
|
+
true
|
145
|
+
end
|
146
|
+
end
|
147
|
+
post_process_persist(result, options) and result
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Persistable
|
4
|
+
|
5
|
+
# Defines behaviour for persistence operations that upsert documents.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Upsertable
|
9
|
+
|
10
|
+
# Perform an upsert of the document. If the document does not exist in the
|
11
|
+
# database, then Mongo will insert a new one, otherwise the fields will get
|
12
|
+
# overwritten with new values on the existing document.
|
13
|
+
#
|
14
|
+
# @example Upsert the document.
|
15
|
+
# document.upsert
|
16
|
+
#
|
17
|
+
# @param [ Hash ] options The validation options.
|
18
|
+
#
|
19
|
+
# @return [ true ] True.
|
20
|
+
#
|
21
|
+
# @since 3.0.0
|
22
|
+
def upsert(options = {})
|
23
|
+
prepare_upsert(options) do
|
24
|
+
collection.find(atomic_selector).update(as_document, [ :upsert ])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Prepare the upsert for execution.
|
31
|
+
#
|
32
|
+
# @api private
|
33
|
+
#
|
34
|
+
# @example Prepare the upsert
|
35
|
+
# document.prepare_upsert do
|
36
|
+
# collection.find(selector).update(as_document)
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# @param [ Hash ] options The options hash.
|
40
|
+
#
|
41
|
+
# @return [ true, false ] If the operation succeeded.
|
42
|
+
#
|
43
|
+
# @since 4.0.0
|
44
|
+
def prepare_upsert(options = {})
|
45
|
+
return false if performing_validations?(options) && invalid?(:upsert)
|
46
|
+
result = run_callbacks(:upsert) do
|
47
|
+
yield(self)
|
48
|
+
true
|
49
|
+
end
|
50
|
+
self.new_record = false
|
51
|
+
post_process_persist(result, options) and result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
|
4
|
+
# This module is responsible for taking update selectors and switching out
|
5
|
+
# the indexes for the $ positional operator where appropriate.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Positional
|
9
|
+
|
10
|
+
# Takes the provided selector and atomic operations and replaces the
|
11
|
+
# indexes of the embedded documents with the positional operator when
|
12
|
+
# needed.
|
13
|
+
#
|
14
|
+
# @note The only time we can accurately know when to use the positional
|
15
|
+
# operator is at the exact time we are going to persist something. So
|
16
|
+
# we can tell by the selector that we are sending if it is actually
|
17
|
+
# possible to use the positional operator at all. For example, if the
|
18
|
+
# selector is: { "_id" => 1 }, then we could not use the positional
|
19
|
+
# operator for updating embedded documents since there would never be a
|
20
|
+
# match - we base whether we can based on the number of levels deep the
|
21
|
+
# selector goes, and if the id values are not nil.
|
22
|
+
#
|
23
|
+
# @example Process the operations.
|
24
|
+
# positionally(
|
25
|
+
# { "_id" => 1, "addresses._id" => 2 },
|
26
|
+
# { "$set" => { "addresses.0.street" => "hobrecht" }}
|
27
|
+
# )
|
28
|
+
#
|
29
|
+
# @param [ Hash ] selector The selector.
|
30
|
+
# @param [ Hash ] operations The update operations.
|
31
|
+
# @param [ Hash ] processed The processed update operations.
|
32
|
+
#
|
33
|
+
# @return [ Hash ] The new operations.
|
34
|
+
#
|
35
|
+
# @since 3.1.0
|
36
|
+
def positionally(selector, operations, processed = {})
|
37
|
+
if selector.size == 1 || selector.values.any? { |val| val.nil? }
|
38
|
+
return operations
|
39
|
+
end
|
40
|
+
keys = selector.keys.map{ |m| m.sub('._id','') } - ['_id']
|
41
|
+
keys = keys.sort_by { |s| s.length*-1 }
|
42
|
+
process_operations(keys, operations, processed)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def process_operations(keys, operations, processed)
|
48
|
+
operations.each_pair do |operation, update|
|
49
|
+
processed[operation] = process_updates(keys, update)
|
50
|
+
end
|
51
|
+
processed
|
52
|
+
end
|
53
|
+
|
54
|
+
def process_updates(keys, update, updates = {})
|
55
|
+
update.each_pair do |position, value|
|
56
|
+
updates[replace_index(keys, position)] = value
|
57
|
+
end
|
58
|
+
updates
|
59
|
+
end
|
60
|
+
|
61
|
+
def replace_index(keys, position)
|
62
|
+
# replace to $ only if that key is on the selector
|
63
|
+
keys.each do |kk|
|
64
|
+
if position =~ /^#{kk}\.\d+\.(.*)/
|
65
|
+
return "#{kk}.$.#{$1}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
position
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid"
|
3
|
+
require "mongoid/config"
|
4
|
+
require "mongoid/railties/document"
|
5
|
+
require "rails"
|
6
|
+
require "rails/mongoid"
|
7
|
+
|
8
|
+
module Rails
|
9
|
+
module Mongoid
|
10
|
+
|
11
|
+
# Hooks Mongoid into Rails 3 and higher.
|
12
|
+
#
|
13
|
+
# @since 2.0.0
|
14
|
+
class Railtie < Rails::Railtie
|
15
|
+
|
16
|
+
# Determine which generator to use. app_generators was introduced after
|
17
|
+
# 3.0.0.
|
18
|
+
#
|
19
|
+
# @example Get the generators method.
|
20
|
+
# railtie.generators
|
21
|
+
#
|
22
|
+
# @return [ Symbol ] The method name to use.
|
23
|
+
#
|
24
|
+
# @since 2.0.0.rc.4
|
25
|
+
def self.generator
|
26
|
+
config.respond_to?(:app_generators) ? :app_generators : :generators
|
27
|
+
end
|
28
|
+
|
29
|
+
# Mapping of rescued exceptions to HTTP responses
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# railtie.rescue_responses
|
33
|
+
#
|
34
|
+
# @ return [Hash] rescued responses
|
35
|
+
#
|
36
|
+
# @since 2.4.3
|
37
|
+
def self.rescue_responses
|
38
|
+
{
|
39
|
+
"Mongoid::Errors::DocumentNotFound" => :not_found,
|
40
|
+
"Mongoid::Errors::Validations" => 422
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
config.send(generator).orm :mongoid, migration: false
|
45
|
+
|
46
|
+
if config.action_dispatch.rescue_responses
|
47
|
+
config.action_dispatch.rescue_responses.merge!(rescue_responses)
|
48
|
+
end
|
49
|
+
|
50
|
+
rake_tasks do
|
51
|
+
load "mongoid/railties/database.rake"
|
52
|
+
end
|
53
|
+
|
54
|
+
# Exposes Mongoid's configuration to the Rails application configuration.
|
55
|
+
#
|
56
|
+
# @example Set up configuration in the Rails app.
|
57
|
+
# module MyApplication
|
58
|
+
# class Application < Rails::Application
|
59
|
+
# config.mongoid.logger = Logger.new($stdout, :warn)
|
60
|
+
# config.mongoid.persist_in_safe_mode = true
|
61
|
+
# end
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# @since 2.0.0
|
65
|
+
config.mongoid = ::Mongoid::Config
|
66
|
+
|
67
|
+
# Initialize Mongoid. This will look for a mongoid.yml in the config
|
68
|
+
# directory and configure mongoid appropriately.
|
69
|
+
#
|
70
|
+
# @since 2.0.0
|
71
|
+
initializer "mongoid.load-config" do
|
72
|
+
config_file = Rails.root.join("config", "mongoid.yml")
|
73
|
+
if config_file.file?
|
74
|
+
begin
|
75
|
+
::Mongoid.load!(config_file)
|
76
|
+
rescue ::Mongoid::Errors::NoSessionsConfig => e
|
77
|
+
handle_configuration_error(e)
|
78
|
+
rescue ::Mongoid::Errors::NoDefaultSession => e
|
79
|
+
handle_configuration_error(e)
|
80
|
+
rescue ::Mongoid::Errors::NoSessionDatabase => e
|
81
|
+
handle_configuration_error(e)
|
82
|
+
rescue ::Mongoid::Errors::NoSessionHosts => e
|
83
|
+
handle_configuration_error(e)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Set the proper error types for Rails. DocumentNotFound errors should be
|
89
|
+
# 404s and not 500s, validation errors are 422s.
|
90
|
+
#
|
91
|
+
# @since 2.0.0
|
92
|
+
config.after_initialize do
|
93
|
+
unless config.action_dispatch.rescue_responses
|
94
|
+
ActionDispatch::ShowExceptions.rescue_responses.update(Railtie.rescue_responses)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Due to all models not getting loaded and messing up inheritance queries
|
99
|
+
# and indexing, we need to preload the models in order to address this.
|
100
|
+
#
|
101
|
+
# This will happen every request in development, once in ther other
|
102
|
+
# environments.
|
103
|
+
#
|
104
|
+
# @since 2.0.0
|
105
|
+
initializer "mongoid.preload-models" do |app|
|
106
|
+
config.to_prepare do
|
107
|
+
::Rails::Mongoid.preload_models(app)
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# Need to include the Mongoid identity map middleware.
|
112
|
+
#
|
113
|
+
# @since 3.0.0
|
114
|
+
initializer "mongoid.use-identity-map-middleware" do |app|
|
115
|
+
app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap"
|
116
|
+
end
|
117
|
+
|
118
|
+
config.after_initialize do
|
119
|
+
# Unicorn clears the START_CTX when a worker is forked, so if we have
|
120
|
+
# data in START_CTX then we know we're being preloaded. Unicorn does
|
121
|
+
# not provide application-level hooks for executing code after the
|
122
|
+
# process has forked, so we reconnect lazily.
|
123
|
+
if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
|
124
|
+
::Mongoid.default_session.disconnect if ::Mongoid.configured?
|
125
|
+
end
|
126
|
+
|
127
|
+
# Passenger provides the :starting_worker_process event for executing
|
128
|
+
# code after it has forked, so we use that and reconnect immediately.
|
129
|
+
if ::Mongoid.running_with_passenger?
|
130
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
131
|
+
::Mongoid.default_session.disconnect if forked
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Rails runs all initializers first before getting into any generator
|
137
|
+
# code, so we have no way in the intitializer to know if we are
|
138
|
+
# generating a mongoid.yml. So instead of failing, we catch all the
|
139
|
+
# errors and print them out.
|
140
|
+
#
|
141
|
+
# @since 3.0.0
|
142
|
+
def handle_configuration_error(e)
|
143
|
+
puts "There is a configuration error with the current mongoid.yml."
|
144
|
+
puts e.message
|
145
|
+
end
|
146
|
+
|
147
|
+
# Clears the idenity map on console reload. Identity map is on a thread
|
148
|
+
# local so it's safe to clear it in all environments.
|
149
|
+
#
|
150
|
+
# @since 4.0.0
|
151
|
+
ActionDispatch::Reloader.to_cleanup do
|
152
|
+
::Mongoid::IdentityMap.clear
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|