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,284 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/attributes/dynamic"
|
3
|
+
require "mongoid/attributes/nested"
|
4
|
+
require "mongoid/attributes/processing"
|
5
|
+
require "mongoid/attributes/readonly"
|
6
|
+
|
7
|
+
module Mongoid
|
8
|
+
|
9
|
+
# This module contains the logic for handling the internal attributes hash,
|
10
|
+
# and how to get and set values.
|
11
|
+
module Attributes
|
12
|
+
extend ActiveSupport::Concern
|
13
|
+
include Nested
|
14
|
+
include Processing
|
15
|
+
include Readonly
|
16
|
+
|
17
|
+
attr_reader :attributes
|
18
|
+
alias :raw_attributes :attributes
|
19
|
+
|
20
|
+
# Determine if an attribute is present.
|
21
|
+
#
|
22
|
+
# @example Is the attribute present?
|
23
|
+
# person.attribute_present?("title")
|
24
|
+
#
|
25
|
+
# @param [ String, Symbol ] name The name of the attribute.
|
26
|
+
#
|
27
|
+
# @return [ true, false ] True if present, false if not.
|
28
|
+
#
|
29
|
+
# @since 1.0.0
|
30
|
+
def attribute_present?(name)
|
31
|
+
attribute = read_attribute(name)
|
32
|
+
!attribute.blank? || attribute == false
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get the attributes that have not been cast.
|
36
|
+
#
|
37
|
+
# @example Get the attributes before type cast.
|
38
|
+
# document.attributes_before_type_cast
|
39
|
+
#
|
40
|
+
# @return [ Hash ] The uncast attributes.
|
41
|
+
#
|
42
|
+
# @since 3.1.0
|
43
|
+
def attributes_before_type_cast
|
44
|
+
@attributes_before_type_cast ||= {}
|
45
|
+
end
|
46
|
+
|
47
|
+
# Does the document have the provided attribute?
|
48
|
+
#
|
49
|
+
# @example Does the document have the attribute?
|
50
|
+
# model.has_attribute?(:name)
|
51
|
+
#
|
52
|
+
# @param [ String, Symbol ] name The name of the attribute.
|
53
|
+
#
|
54
|
+
# @return [ true, false ] If the key is present in the attributes.
|
55
|
+
#
|
56
|
+
# @since 3.0.0
|
57
|
+
def has_attribute?(name)
|
58
|
+
attributes.has_key?(name.to_s)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Does the document have the provided attribute before it was assigned
|
62
|
+
# and type cast?
|
63
|
+
#
|
64
|
+
# @example Does the document have the attribute before it was assigned?
|
65
|
+
# model.has_attribute_before_type_cast?(:name)
|
66
|
+
#
|
67
|
+
# @param [ String, Symbol ] name The name of the attribute.
|
68
|
+
#
|
69
|
+
# @return [ true, false ] If the key is present in the
|
70
|
+
# attributes_before_type_cast.
|
71
|
+
#
|
72
|
+
# @since 3.1.0
|
73
|
+
def has_attribute_before_type_cast?(name)
|
74
|
+
attributes_before_type_cast.has_key?(name.to_s)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Read a value from the document attributes. If the value does not exist
|
78
|
+
# it will return nil.
|
79
|
+
#
|
80
|
+
# @example Read an attribute.
|
81
|
+
# person.read_attribute(:title)
|
82
|
+
#
|
83
|
+
# @example Read an attribute (alternate syntax.)
|
84
|
+
# person[:title]
|
85
|
+
#
|
86
|
+
# @param [ String, Symbol ] name The name of the attribute to get.
|
87
|
+
#
|
88
|
+
# @return [ Object ] The value of the attribute.
|
89
|
+
#
|
90
|
+
# @since 1.0.0
|
91
|
+
def read_attribute(name)
|
92
|
+
normalized = database_field_name(name.to_s)
|
93
|
+
if hash_dot_syntax?(normalized)
|
94
|
+
attributes.__nested__(normalized)
|
95
|
+
else
|
96
|
+
attributes[normalized]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
alias :[] :read_attribute
|
100
|
+
|
101
|
+
# Read a value from the attributes before type cast. If the value has not
|
102
|
+
# yet been assigned then this will return the attribute's existing value
|
103
|
+
# using read_attribute.
|
104
|
+
#
|
105
|
+
# @example Read an attribute before type cast.
|
106
|
+
# person.read_attribute_before_type_cast(:price)
|
107
|
+
#
|
108
|
+
# @param [ String, Symbol ] name The name of the attribute to get.
|
109
|
+
#
|
110
|
+
# @return [ Object ] The value of the attribute before type cast, if
|
111
|
+
# available. Otherwise, the value of the attribute.
|
112
|
+
#
|
113
|
+
# @since 3.1.0
|
114
|
+
def read_attribute_before_type_cast(name)
|
115
|
+
attr = name.to_s
|
116
|
+
if attributes_before_type_cast.has_key?(attr)
|
117
|
+
attributes_before_type_cast[attr]
|
118
|
+
else
|
119
|
+
read_attribute(attr)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Remove a value from the +Document+ attributes. If the value does not exist
|
124
|
+
# it will fail gracefully.
|
125
|
+
#
|
126
|
+
# @example Remove the attribute.
|
127
|
+
# person.remove_attribute(:title)
|
128
|
+
#
|
129
|
+
# @param [ String, Symbol ] name The name of the attribute to remove.
|
130
|
+
#
|
131
|
+
# @raise [ Errors::ReadonlyAttribute ] If the field cannot be removed due
|
132
|
+
# to being flagged as reaodnly.
|
133
|
+
#
|
134
|
+
# @since 1.0.0
|
135
|
+
def remove_attribute(name)
|
136
|
+
access = name.to_s
|
137
|
+
unless attribute_writable?(name)
|
138
|
+
raise Errors::ReadonlyAttribute.new(name, :nil)
|
139
|
+
end
|
140
|
+
_assigning do
|
141
|
+
attribute_will_change!(access)
|
142
|
+
delayed_atomic_unsets[atomic_attribute_name(access)] = [] unless new_record?
|
143
|
+
attributes.delete(access)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Write a single attribute to the document attribute hash. This will
|
148
|
+
# also fire the before and after update callbacks, and perform any
|
149
|
+
# necessary typecasting.
|
150
|
+
#
|
151
|
+
# @example Write the attribute.
|
152
|
+
# person.write_attribute(:title, "Mr.")
|
153
|
+
#
|
154
|
+
# @example Write the attribute (alternate syntax.)
|
155
|
+
# person[:title] = "Mr."
|
156
|
+
#
|
157
|
+
# @param [ String, Symbol ] name The name of the attribute to update.
|
158
|
+
# @param [ Object ] value The value to set for the attribute.
|
159
|
+
#
|
160
|
+
# @since 1.0.0
|
161
|
+
def write_attribute(name, value)
|
162
|
+
access = database_field_name(name.to_s)
|
163
|
+
if attribute_writable?(access)
|
164
|
+
_assigning do
|
165
|
+
localized = fields[access].try(:localized?)
|
166
|
+
attributes_before_type_cast[name.to_s] = value
|
167
|
+
typed_value = typed_value_for(access, value)
|
168
|
+
unless attributes[access] == typed_value || attribute_changed?(access)
|
169
|
+
attribute_will_change!(access)
|
170
|
+
end
|
171
|
+
if localized
|
172
|
+
(attributes[access] ||= {}).merge!(typed_value)
|
173
|
+
else
|
174
|
+
attributes[access] = typed_value
|
175
|
+
end
|
176
|
+
typed_value
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
alias :[]= :write_attribute
|
181
|
+
|
182
|
+
# Allows you to set all the attributes for a particular mass-assignment security role
|
183
|
+
# by passing in a hash of attributes with keys matching the attribute names
|
184
|
+
# (which again matches the column names) and the role name using the :as option.
|
185
|
+
# To bypass mass-assignment security you can use the :without_protection => true option.
|
186
|
+
#
|
187
|
+
# @example Assign the attributes.
|
188
|
+
# person.assign_attributes(:title => "Mr.")
|
189
|
+
#
|
190
|
+
# @example Assign the attributes (with a role).
|
191
|
+
# person.assign_attributes({ :title => "Mr." }, :as => :admin)
|
192
|
+
#
|
193
|
+
# @param [ Hash ] attrs The new attributes to set.
|
194
|
+
#
|
195
|
+
# @since 2.2.1
|
196
|
+
def assign_attributes(attrs = nil)
|
197
|
+
_assigning do
|
198
|
+
process_attributes(attrs)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
# Writes the supplied attributes hash to the document. This will only
|
203
|
+
# overwrite existing attributes if they are present in the new +Hash+, all
|
204
|
+
# others will be preserved.
|
205
|
+
#
|
206
|
+
# @example Write the attributes.
|
207
|
+
# person.write_attributes(:title => "Mr.")
|
208
|
+
#
|
209
|
+
# @example Write the attributes (alternate syntax.)
|
210
|
+
# person.attributes = { :title => "Mr." }
|
211
|
+
#
|
212
|
+
# @param [ Hash ] attrs The new attributes to set.
|
213
|
+
# @param [ Boolean ] guard_protected_attributes False to skip mass assignment protection.
|
214
|
+
#
|
215
|
+
# @since 1.0.0
|
216
|
+
def write_attributes(attrs = nil)
|
217
|
+
assign_attributes(attrs)
|
218
|
+
end
|
219
|
+
alias :attributes= :write_attributes
|
220
|
+
|
221
|
+
private
|
222
|
+
|
223
|
+
# Does the string contain dot syntax for accessing hashes?
|
224
|
+
#
|
225
|
+
# @api private
|
226
|
+
#
|
227
|
+
# @example Is the string in dot syntax.
|
228
|
+
# model.hash_dot_syntax?
|
229
|
+
#
|
230
|
+
# @return [ true, false ] If the string contains a "."
|
231
|
+
#
|
232
|
+
# @since 3.0.15
|
233
|
+
def hash_dot_syntax?(string)
|
234
|
+
string =~ /\./
|
235
|
+
end
|
236
|
+
|
237
|
+
# Return the typecasted value for a field.
|
238
|
+
#
|
239
|
+
# @example Get the value typecasted.
|
240
|
+
# person.typed_value_for(:title, :sir)
|
241
|
+
#
|
242
|
+
# @param [ String, Symbol ] key The field name.
|
243
|
+
# @param [ Object ] value The uncast value.
|
244
|
+
#
|
245
|
+
# @return [ Object ] The cast value.
|
246
|
+
#
|
247
|
+
# @since 1.0.0
|
248
|
+
def typed_value_for(key, value)
|
249
|
+
fields.has_key?(key) ? fields[key].mongoize(value) : value.mongoize
|
250
|
+
end
|
251
|
+
|
252
|
+
module ClassMethods
|
253
|
+
|
254
|
+
# Alias the provided name to the original field. This will provide an
|
255
|
+
# aliased getter, setter, existance check, and all dirty attribute
|
256
|
+
# methods.
|
257
|
+
#
|
258
|
+
# @example Alias the attribute.
|
259
|
+
# class Product
|
260
|
+
# include Mongoid::Document
|
261
|
+
# field :price, :type => Float
|
262
|
+
# alias_attribute :cost, :price
|
263
|
+
# end
|
264
|
+
#
|
265
|
+
# @param [ Symbol ] name The new name.
|
266
|
+
# @param [ Symbol ] original The original name.
|
267
|
+
#
|
268
|
+
# @since 2.3.0
|
269
|
+
def alias_attribute(name, original)
|
270
|
+
class_eval <<-RUBY
|
271
|
+
alias #{name} #{original}
|
272
|
+
alias #{name}= #{original}=
|
273
|
+
alias #{name}? #{original}?
|
274
|
+
alias #{name}_change #{original}_change
|
275
|
+
alias #{name}_changed? #{original}_changed?
|
276
|
+
alias reset_#{name}! reset_#{original}!
|
277
|
+
alias #{name}_was #{original}_was
|
278
|
+
alias #{name}_will_change! #{original}_will_change!
|
279
|
+
alias #{name}_before_type_cast #{original}_before_type_cast
|
280
|
+
RUBY
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Attributes
|
4
|
+
|
5
|
+
# This module contains the behavior for dynamic attributes.
|
6
|
+
#
|
7
|
+
# @since 4.0.0
|
8
|
+
module Dynamic
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
# Override respond_to? so it responds properly for dynamic attributes.
|
12
|
+
#
|
13
|
+
# @example Does this object respond to the method?
|
14
|
+
# person.respond_to?(:title)
|
15
|
+
#
|
16
|
+
# @param [ Array ] *args The name of the method.
|
17
|
+
#
|
18
|
+
# @return [ true, false ] True if it does, false if not.
|
19
|
+
#
|
20
|
+
# @since 4.0.0
|
21
|
+
def respond_to?(name, include_private = false)
|
22
|
+
super || (
|
23
|
+
attributes &&
|
24
|
+
attributes.has_key?(name.to_s.reader)
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Define a reader method for a dynamic attribute.
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
# @example Define a reader method.
|
33
|
+
# model.define_dynamic_reader(:field)
|
34
|
+
#
|
35
|
+
# @param [ String ] name The name of the field.
|
36
|
+
#
|
37
|
+
# @since 4.0.0
|
38
|
+
def define_dynamic_reader(name)
|
39
|
+
return unless name.valid_method_name?
|
40
|
+
class_eval <<-READER
|
41
|
+
def #{name}
|
42
|
+
attribute_will_change!(#{name.inspect})
|
43
|
+
read_attribute(#{name.inspect})
|
44
|
+
end
|
45
|
+
READER
|
46
|
+
end
|
47
|
+
|
48
|
+
# Define a reader method for a dynamic attribute before type cast.
|
49
|
+
#
|
50
|
+
# @api private
|
51
|
+
#
|
52
|
+
# @example Define a reader method for an attribute.
|
53
|
+
# model.define_dynamic_before_type_cast_reader(:field)
|
54
|
+
#
|
55
|
+
# @param [ String ] name The name of the field.
|
56
|
+
#
|
57
|
+
# @since 4.0.0
|
58
|
+
def define_dynamic_before_type_cast_reader(name)
|
59
|
+
class_eval <<-READER
|
60
|
+
def #{name}_before_type_cast
|
61
|
+
attribute_will_change!(#{name.inspect})
|
62
|
+
read_attribute_before_type_cast(#{name.inspect})
|
63
|
+
end
|
64
|
+
READER
|
65
|
+
end
|
66
|
+
|
67
|
+
# Define a writer method for a dynamic attribute.
|
68
|
+
#
|
69
|
+
# @api private
|
70
|
+
#
|
71
|
+
# @example Define a writer method.
|
72
|
+
# model.define_dynamic_writer(:field)
|
73
|
+
#
|
74
|
+
# @param [ String ] name The name of the field.
|
75
|
+
#
|
76
|
+
# @since 4.0.0
|
77
|
+
def define_dynamic_writer(name)
|
78
|
+
return unless name.valid_method_name?
|
79
|
+
|
80
|
+
class_eval <<-WRITER
|
81
|
+
def #{name}=(value)
|
82
|
+
write_attribute(#{name.inspect}, value)
|
83
|
+
end
|
84
|
+
WRITER
|
85
|
+
end
|
86
|
+
|
87
|
+
# If the attribute is dynamic, add a field for it with a type of object
|
88
|
+
# and set the value.
|
89
|
+
#
|
90
|
+
# @example Process the attribute.
|
91
|
+
# document.process_attribute(name, value)
|
92
|
+
#
|
93
|
+
# @param [ Symbol ] name The name of the field.
|
94
|
+
# @param [ Object ] value The value of the field.
|
95
|
+
#
|
96
|
+
# @since 4.0.0
|
97
|
+
def process_attribute(name, value)
|
98
|
+
responds = respond_to?("#{name}=")
|
99
|
+
if !responds
|
100
|
+
write_attribute(name, value)
|
101
|
+
else
|
102
|
+
send("#{name}=", value)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
# Get an array of inspected dynamic fields for the document.
|
107
|
+
#
|
108
|
+
# @example Inspect the dynamic fields.
|
109
|
+
# document.inspect_dynamic_fields
|
110
|
+
#
|
111
|
+
# @return [ String ] An array of pretty printed dynamic field values.
|
112
|
+
#
|
113
|
+
# @since 4.0.0
|
114
|
+
def inspect_dynamic_fields
|
115
|
+
keys = attributes.keys - fields.keys - relations.keys - ["_id", "_type"]
|
116
|
+
return keys.map do |name|
|
117
|
+
"#{name}: #{attributes[name].inspect}"
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Used for allowing accessor methods for dynamic attributes.
|
122
|
+
#
|
123
|
+
# @api private
|
124
|
+
#
|
125
|
+
# @example Call through method_missing.
|
126
|
+
# document.method_missing(:test)
|
127
|
+
#
|
128
|
+
# @param [ String, Symbol ] name The name of the method.
|
129
|
+
# @param [ Array ] *args The arguments to the method.
|
130
|
+
#
|
131
|
+
# @return [ Object ] The result of the method call.
|
132
|
+
#
|
133
|
+
# @since 4.0.0
|
134
|
+
def method_missing(name, *args)
|
135
|
+
attr = name.to_s
|
136
|
+
return super unless attributes.has_key?(attr.reader)
|
137
|
+
if attr.writer?
|
138
|
+
getter = attr.reader
|
139
|
+
define_dynamic_writer(getter)
|
140
|
+
write_attribute(getter, args.first)
|
141
|
+
elsif attr.before_type_cast?
|
142
|
+
define_dynamic_before_type_cast_reader(attr.reader)
|
143
|
+
attribute_will_change!(attr.reader)
|
144
|
+
read_attribute_before_type_cast(attr.reader)
|
145
|
+
else
|
146
|
+
getter = attr.reader
|
147
|
+
define_dynamic_reader(getter)
|
148
|
+
attribute_will_change!(attr.reader)
|
149
|
+
read_attribute(getter)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid
|
3
|
+
module Attributes
|
4
|
+
|
5
|
+
# Defines behaviour around that lovel Rails feature nested attributes.
|
6
|
+
#
|
7
|
+
# @since 1.0.0
|
8
|
+
module Nested
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
class_attribute :nested_attributes
|
13
|
+
self.nested_attributes = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
module ClassMethods
|
17
|
+
|
18
|
+
REJECT_ALL_BLANK_PROC = ->(attributes){
|
19
|
+
attributes.all? { |key, value| key == '_destroy' || value.blank? }
|
20
|
+
}
|
21
|
+
|
22
|
+
# Used when needing to update related models from a parent relation. Can
|
23
|
+
# be used on embedded or referenced relations.
|
24
|
+
#
|
25
|
+
# @example Defining nested attributes.
|
26
|
+
#
|
27
|
+
# class Person
|
28
|
+
# include Mongoid::Document
|
29
|
+
#
|
30
|
+
# embeds_many :addresses
|
31
|
+
# embeds_one :game
|
32
|
+
# references_many :posts
|
33
|
+
#
|
34
|
+
# accepts_nested_attributes_for :addresses, :game, :posts
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# @param [ Array<Symbol>, Hash ] *args A list of relation names, followed
|
38
|
+
# by a hash of options.
|
39
|
+
#
|
40
|
+
# @option *args [ true, false ] :allow_destroy Can deletion occur?
|
41
|
+
# @option *args [ Proc, Symbol ] :reject_if Block or symbol pointing
|
42
|
+
# to a class method to reject documents with.
|
43
|
+
# @option *args [ Integer ] :limit The max number to create.
|
44
|
+
# @option *args [ true, false ] :update_only Only update existing docs.
|
45
|
+
def accepts_nested_attributes_for(*args)
|
46
|
+
options = args.extract_options!
|
47
|
+
options[:reject_if] = REJECT_ALL_BLANK_PROC if options[:reject_if] == :all_blank
|
48
|
+
args.each do |name|
|
49
|
+
meth = "#{name}_attributes="
|
50
|
+
self.nested_attributes["#{name}_attributes"] = meth
|
51
|
+
metadata = relations[name.to_s]
|
52
|
+
raise Errors::NestedAttributesMetadataNotFound.new(self, name) unless metadata
|
53
|
+
autosave_nested_attributes(metadata)
|
54
|
+
re_define_method(meth) do |attrs|
|
55
|
+
_assigning do
|
56
|
+
metadata.nested_builder(attrs, options).build(self)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# Add the autosave information for the nested relation.
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
#
|
68
|
+
# @example Add the autosave if appropriate.
|
69
|
+
# Person.autosave_nested_attributes(metadata)
|
70
|
+
#
|
71
|
+
# @param [ Metadata ] metadata The existing relation metadata.
|
72
|
+
#
|
73
|
+
# @since 3.1.4
|
74
|
+
def autosave_nested_attributes(metadata)
|
75
|
+
unless metadata.autosave == false
|
76
|
+
autosave(metadata.merge!(autosave: true))
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|