mongoid 2.4.10 → 3.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.
- data/CHANGELOG.md +949 -10
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +3 -17
- data/lib/config/locales/en.yml +455 -51
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/atomic.rb +70 -16
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/callbacks.rb +106 -43
- data/lib/mongoid/components.rb +12 -23
- data/lib/mongoid/config/environment.rb +7 -4
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config.rb +104 -225
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +68 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +406 -0
- data/lib/mongoid/contextual/mongo.rb +662 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +7 -25
- data/lib/mongoid/criteria.rb +515 -245
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +71 -52
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- 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 +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- 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 +3 -3
- 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 +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/errors.rb +23 -1
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions/array.rb +164 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -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 +123 -0
- data/lib/mongoid/extensions/integer.rb +66 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +238 -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 +181 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +38 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +150 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +142 -208
- data/lib/mongoid/finders.rb +45 -50
- data/lib/mongoid/hierarchy.rb +44 -15
- data/lib/mongoid/identity_map.rb +49 -21
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/multi_parameter_attributes.rb +9 -11
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +10 -44
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/persistence/operations/upsert.rb +28 -0
- data/lib/mongoid/persistence/operations.rb +22 -19
- data/lib/mongoid/persistence/upsertion.rb +30 -0
- data/lib/mongoid/persistence.rb +94 -39
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +120 -20
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +4 -4
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/cascading.rb +10 -7
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +6 -7
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +347 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +100 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -60
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +277 -47
- data/lib/mongoid/relations/nested_builder.rb +4 -6
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +62 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +162 -130
- data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/relations/touchable.rb +32 -0
- data/lib/mongoid/relations.rb +22 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +312 -0
- data/lib/mongoid/serialization.rb +94 -42
- data/lib/mongoid/sessions/factory.rb +108 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions.rb +383 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded/lifecycle.rb +21 -21
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/threaded.rb +219 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +4 -3
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +34 -4
- data/lib/mongoid/validations/uniqueness.rb +11 -12
- data/lib/mongoid/validations.rb +28 -20
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/mongoid.rb +37 -37
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +65 -17
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +73 -26
- metadata +103 -148
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/collections/retry.rb +0 -59
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -108
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -76
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/javascript/functions.yml +0 -63
- data/lib/mongoid/javascript.rb +0 -20
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
4
|
|
|
5
5
|
# This module contains the core macros for defining relations between
|
|
6
6
|
# documents. They can be either embedded or referenced (relational).
|
|
@@ -8,9 +8,11 @@ module Mongoid # :nodoc:
|
|
|
8
8
|
extend ActiveSupport::Concern
|
|
9
9
|
|
|
10
10
|
included do
|
|
11
|
-
class_attribute :embedded, :
|
|
11
|
+
class_attribute :embedded, instance_reader: false
|
|
12
|
+
class_attribute :embedded_relations
|
|
12
13
|
class_attribute :relations
|
|
13
14
|
self.embedded = false
|
|
15
|
+
self.embedded_relations = {}
|
|
14
16
|
self.relations = {}
|
|
15
17
|
end
|
|
16
18
|
|
|
@@ -26,7 +28,7 @@ module Mongoid # :nodoc:
|
|
|
26
28
|
self.relations
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
module ClassMethods
|
|
31
|
+
module ClassMethods
|
|
30
32
|
|
|
31
33
|
# Adds the relation back to the parent document. This macro is
|
|
32
34
|
# necessary to set the references from the child back to the parent
|
|
@@ -49,10 +51,14 @@ module Mongoid # :nodoc:
|
|
|
49
51
|
# @param [ Hash ] options The relation options.
|
|
50
52
|
# @param [ Proc ] block Optional block for defining extensions.
|
|
51
53
|
def embedded_in(name, options = {}, &block)
|
|
52
|
-
|
|
53
|
-
self
|
|
54
|
-
relate(name, meta)
|
|
54
|
+
if ancestors.include?(Mongoid::Versioning)
|
|
55
|
+
raise Errors::VersioningNotOnRoot.new(self)
|
|
55
56
|
end
|
|
57
|
+
meta = characterize(name, Embedded::In, options, &block)
|
|
58
|
+
self.embedded = true
|
|
59
|
+
relate(name, meta)
|
|
60
|
+
builder(name, meta).creator(name, meta)
|
|
61
|
+
meta
|
|
56
62
|
end
|
|
57
63
|
|
|
58
64
|
# Adds the relation from a parent document to its children. The name
|
|
@@ -75,11 +81,12 @@ module Mongoid # :nodoc:
|
|
|
75
81
|
# @param [ Hash ] options The relation options.
|
|
76
82
|
# @param [ Proc ] block Optional block for defining extensions.
|
|
77
83
|
def embeds_many(name, options = {}, &block)
|
|
78
|
-
characterize(name, Embedded::Many, options, &block)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
meta = characterize(name, Embedded::Many, options, &block)
|
|
85
|
+
self.cyclic = true if options[:cyclic]
|
|
86
|
+
relate(name, meta)
|
|
87
|
+
embed(name, meta)
|
|
88
|
+
validates_relation(meta)
|
|
89
|
+
meta
|
|
83
90
|
end
|
|
84
91
|
|
|
85
92
|
# Adds the relation from a parent document to its child. The name
|
|
@@ -102,12 +109,13 @@ module Mongoid # :nodoc:
|
|
|
102
109
|
# @param [ Hash ] options The relation options.
|
|
103
110
|
# @param [ Proc ] block Optional block for defining extensions.
|
|
104
111
|
def embeds_one(name, options = {}, &block)
|
|
105
|
-
characterize(name, Embedded::One, options, &block)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
112
|
+
meta = characterize(name, Embedded::One, options, &block)
|
|
113
|
+
self.cyclic = true if options[:cyclic]
|
|
114
|
+
relate(name, meta)
|
|
115
|
+
embed(name, meta)
|
|
116
|
+
builder(name, meta).creator(name, meta)
|
|
117
|
+
validates_relation(meta)
|
|
118
|
+
meta
|
|
111
119
|
end
|
|
112
120
|
|
|
113
121
|
# Adds a relational association from the child Document to a Document in
|
|
@@ -129,15 +137,11 @@ module Mongoid # :nodoc:
|
|
|
129
137
|
# @param [ Hash ] options The relation options.
|
|
130
138
|
# @param [ Proc ] block Optional block for defining extensions.
|
|
131
139
|
def belongs_to(name, options = {}, &block)
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
validates_relation(meta)
|
|
137
|
-
end
|
|
140
|
+
meta = reference_one_to_one(name, options, Referenced::In, &block)
|
|
141
|
+
aliased_fields[name.to_s] = meta.foreign_key
|
|
142
|
+
touchable(meta)
|
|
143
|
+
meta
|
|
138
144
|
end
|
|
139
|
-
alias :belongs_to_related :belongs_to
|
|
140
|
-
alias :referenced_in :belongs_to
|
|
141
145
|
|
|
142
146
|
# Adds a relational association from a parent Document to many
|
|
143
147
|
# Documents in another database or collection.
|
|
@@ -158,15 +162,14 @@ module Mongoid # :nodoc:
|
|
|
158
162
|
# @param [ Hash ] options The relation options.
|
|
159
163
|
# @param [ Proc ] block Optional block for defining extensions.
|
|
160
164
|
def has_many(name, options = {}, &block)
|
|
161
|
-
characterize(name, Referenced::Many, options, &block)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
meta = characterize(name, Referenced::Many, options, &block)
|
|
166
|
+
relate(name, meta)
|
|
167
|
+
ids_getter(name, meta).ids_setter(name, meta)
|
|
168
|
+
reference(meta)
|
|
169
|
+
autosave(meta)
|
|
170
|
+
validates_relation(meta)
|
|
171
|
+
meta
|
|
167
172
|
end
|
|
168
|
-
alias :has_many_related :has_many
|
|
169
|
-
alias :references_many :has_many
|
|
170
173
|
|
|
171
174
|
# Adds a relational many-to-many association between many of this
|
|
172
175
|
# Document and many of another Document.
|
|
@@ -189,15 +192,14 @@ module Mongoid # :nodoc:
|
|
|
189
192
|
#
|
|
190
193
|
# @since 2.0.0.rc.1
|
|
191
194
|
def has_and_belongs_to_many(name, options = {}, &block)
|
|
192
|
-
characterize(name, Referenced::ManyToMany, options, &block)
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
195
|
+
meta = characterize(name, Referenced::ManyToMany, options, &block)
|
|
196
|
+
relate(name, meta)
|
|
197
|
+
reference(meta, Array)
|
|
198
|
+
autosave(meta)
|
|
199
|
+
validates_relation(meta)
|
|
200
|
+
synced(meta)
|
|
201
|
+
meta
|
|
199
202
|
end
|
|
200
|
-
alias :references_and_referenced_in_many :has_and_belongs_to_many
|
|
201
203
|
|
|
202
204
|
# Adds a relational association from the child Document to a Document in
|
|
203
205
|
# another database or collection.
|
|
@@ -218,20 +220,15 @@ module Mongoid # :nodoc:
|
|
|
218
220
|
# @param [ Hash ] options The relation options.
|
|
219
221
|
# @param [ Proc ] block Optional block for defining extensions.
|
|
220
222
|
def has_one(name, options = {}, &block)
|
|
221
|
-
|
|
222
|
-
relate(name, meta)
|
|
223
|
-
reference(meta)
|
|
224
|
-
builder(name, meta).creator(name, meta).autosave(meta)
|
|
225
|
-
validates_relation(meta)
|
|
226
|
-
end
|
|
223
|
+
reference_one_to_one(name, options, Referenced::One, &block)
|
|
227
224
|
end
|
|
228
|
-
alias :has_one_related :has_one
|
|
229
|
-
alias :references_one :has_one
|
|
230
225
|
|
|
231
226
|
private
|
|
232
227
|
|
|
233
228
|
# Create the metadata for the relation.
|
|
234
229
|
#
|
|
230
|
+
# @api private
|
|
231
|
+
#
|
|
235
232
|
# @example Create the metadata.
|
|
236
233
|
# Person.characterize(:posts, Referenced::Many, {})
|
|
237
234
|
#
|
|
@@ -243,15 +240,17 @@ module Mongoid # :nodoc:
|
|
|
243
240
|
# @return [ Metadata ] The metadata for the relation.
|
|
244
241
|
def characterize(name, relation, options, &block)
|
|
245
242
|
Metadata.new({
|
|
246
|
-
:
|
|
247
|
-
:
|
|
248
|
-
:
|
|
249
|
-
:
|
|
243
|
+
relation: relation,
|
|
244
|
+
extend: create_extension_module(name, &block),
|
|
245
|
+
inverse_class_name: self.name,
|
|
246
|
+
name: name
|
|
250
247
|
}.merge(options))
|
|
251
248
|
end
|
|
252
249
|
|
|
253
250
|
# Generate a named extension module suitable for marshaling
|
|
254
251
|
#
|
|
252
|
+
# @api private
|
|
253
|
+
#
|
|
255
254
|
# @example Get the module.
|
|
256
255
|
# Person.create_extension_module(:posts, &block)
|
|
257
256
|
#
|
|
@@ -272,9 +271,27 @@ module Mongoid # :nodoc:
|
|
|
272
271
|
end
|
|
273
272
|
end
|
|
274
273
|
|
|
274
|
+
# Add an embedded relation metadata to the embedded relations.
|
|
275
|
+
#
|
|
276
|
+
# @api private
|
|
277
|
+
#
|
|
278
|
+
# @example Add the metadata to embedded relations.
|
|
279
|
+
# Person.embed("addresses", metadata)
|
|
280
|
+
#
|
|
281
|
+
# @param [ String ] name The name of the relation.
|
|
282
|
+
# @param [ Metadata ] metadata The relation metadata.
|
|
283
|
+
#
|
|
284
|
+
# @since 3.0.0
|
|
285
|
+
def embed(name, metadata)
|
|
286
|
+
self.embedded_relations =
|
|
287
|
+
embedded_relations.merge(name.to_s => metadata)
|
|
288
|
+
end
|
|
289
|
+
|
|
275
290
|
# Defines a field to be used as a foreign key in the relation and
|
|
276
291
|
# indexes it if defined.
|
|
277
292
|
#
|
|
293
|
+
# @api private
|
|
294
|
+
#
|
|
278
295
|
# @example Set up the relational fields and indexes.
|
|
279
296
|
# Person.reference(metadata)
|
|
280
297
|
#
|
|
@@ -285,15 +302,43 @@ module Mongoid # :nodoc:
|
|
|
285
302
|
key = metadata.foreign_key
|
|
286
303
|
field(
|
|
287
304
|
key,
|
|
288
|
-
:
|
|
289
|
-
:
|
|
290
|
-
:
|
|
291
|
-
:
|
|
305
|
+
type: type,
|
|
306
|
+
identity: true,
|
|
307
|
+
metadata: metadata,
|
|
308
|
+
default: metadata.foreign_key_default
|
|
292
309
|
)
|
|
293
|
-
|
|
310
|
+
if metadata.indexed?
|
|
311
|
+
if metadata.polymorphic?
|
|
312
|
+
index({ key => 1, metadata.type => 1 }, { background: true })
|
|
313
|
+
else
|
|
314
|
+
index({ key => 1 }, { background: true })
|
|
315
|
+
end
|
|
316
|
+
end
|
|
294
317
|
end
|
|
295
318
|
end
|
|
296
319
|
|
|
320
|
+
# Handle common behaviour for referenced 1-1 relation setup.
|
|
321
|
+
#
|
|
322
|
+
# @api private
|
|
323
|
+
#
|
|
324
|
+
# @example Add the one to one behaviour.
|
|
325
|
+
# Model.reference_one_to_one(:name, meta)
|
|
326
|
+
#
|
|
327
|
+
# @param [ Symbol ] name The name of the relation.
|
|
328
|
+
# @param [ Metadata ] meta The relation metadata.
|
|
329
|
+
#
|
|
330
|
+
# @return [ Class ] The model class.
|
|
331
|
+
#
|
|
332
|
+
# @since 3.0.0
|
|
333
|
+
def reference_one_to_one(name, options, relation, &block)
|
|
334
|
+
meta = characterize(name, relation, options, &block)
|
|
335
|
+
relate(name, meta)
|
|
336
|
+
reference(meta)
|
|
337
|
+
builder(name, meta).creator(name, meta).autosave(meta)
|
|
338
|
+
validates_relation(meta)
|
|
339
|
+
meta
|
|
340
|
+
end
|
|
341
|
+
|
|
297
342
|
# Creates a relation for the given name, metadata and relation. It adds
|
|
298
343
|
# the metadata to the relations hash and has the accessors set up.
|
|
299
344
|
#
|
|
@@ -304,7 +349,7 @@ module Mongoid # :nodoc:
|
|
|
304
349
|
# @param [ Metadata ] metadata The metadata for the relation.
|
|
305
350
|
def relate(name, metadata)
|
|
306
351
|
self.relations = relations.merge(name.to_s => metadata)
|
|
307
|
-
getter(name, metadata).setter(name, metadata)
|
|
352
|
+
getter(name, metadata).setter(name, metadata).existence_check(name, metadata)
|
|
308
353
|
end
|
|
309
354
|
end
|
|
310
355
|
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
4
|
|
|
5
5
|
# This is the superclass for all many to one and many to many relation
|
|
6
6
|
# proxies.
|
|
7
7
|
class Many < Proxy
|
|
8
8
|
|
|
9
|
-
delegate :avg, :max, :min, :sum, :
|
|
10
|
-
delegate :length, :size, :
|
|
9
|
+
delegate :avg, :max, :min, :sum, to: :criteria
|
|
10
|
+
delegate :length, :size, to: :target
|
|
11
11
|
|
|
12
12
|
# Is the relation empty?
|
|
13
13
|
#
|
|
@@ -21,6 +21,57 @@ module Mongoid #:nodoc:
|
|
|
21
21
|
size == 0
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
+
# Creates a new document on the references many relation. This will
|
|
25
|
+
# save the document if the parent has been persisted.
|
|
26
|
+
#
|
|
27
|
+
# @example Create and save the new document.
|
|
28
|
+
# person.posts.create(:text => "Testing")
|
|
29
|
+
#
|
|
30
|
+
# @overload create(attributes = nil, options = {}, type = nil)
|
|
31
|
+
# @param [ Hash ] attributes The attributes to create with.
|
|
32
|
+
# @param [ Hash ] options The scoped assignment options.
|
|
33
|
+
# @param [ Class ] type The optional type of document to create.
|
|
34
|
+
#
|
|
35
|
+
# @overload create(attributes = nil, type = nil)
|
|
36
|
+
# @param [ Hash ] attributes The attributes to create with.
|
|
37
|
+
# @param [ Class ] type The optional type of document to create.
|
|
38
|
+
#
|
|
39
|
+
# @return [ Document ] The newly created document.
|
|
40
|
+
#
|
|
41
|
+
# @since 2.0.0.beta.1
|
|
42
|
+
def create(attributes = nil, options = {}, type = nil, &block)
|
|
43
|
+
doc = build(attributes, options, type, &block)
|
|
44
|
+
base.persisted? ? doc.save : raise_unsaved(doc)
|
|
45
|
+
doc
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Creates a new document on the references many relation. This will
|
|
49
|
+
# save the document if the parent has been persisted and will raise an
|
|
50
|
+
# error if validation fails.
|
|
51
|
+
#
|
|
52
|
+
# @example Create and save the new document.
|
|
53
|
+
# person.posts.create!(:text => "Testing")
|
|
54
|
+
#
|
|
55
|
+
# @overload create!(attributes = nil, options = {}, type = nil)
|
|
56
|
+
# @param [ Hash ] attributes The attributes to create with.
|
|
57
|
+
# @param [ Hash ] options The scoped assignment options.
|
|
58
|
+
# @param [ Class ] type The optional type of document to create.
|
|
59
|
+
#
|
|
60
|
+
# @overload create!(attributes = nil, type = nil)
|
|
61
|
+
# @param [ Hash ] attributes The attributes to create with.
|
|
62
|
+
# @param [ Class ] type The optional type of document to create.
|
|
63
|
+
#
|
|
64
|
+
# @raise [ Errors::Validations ] If validation failed.
|
|
65
|
+
#
|
|
66
|
+
# @return [ Document ] The newly created document.
|
|
67
|
+
#
|
|
68
|
+
# @since 2.0.0.beta.1
|
|
69
|
+
def create!(attributes = nil, options = {}, type = nil, &block)
|
|
70
|
+
doc = build(attributes, options, type, &block)
|
|
71
|
+
base.persisted? ? doc.save! : raise_unsaved(doc)
|
|
72
|
+
doc
|
|
73
|
+
end
|
|
74
|
+
|
|
24
75
|
# Determine if any documents in this relation exist in the database.
|
|
25
76
|
#
|
|
26
77
|
# @example Are there persisted documents?
|
|
@@ -37,11 +88,18 @@ module Mongoid #:nodoc:
|
|
|
37
88
|
# @example Find or create.
|
|
38
89
|
# person.posts.find_or_create_by(:title => "Testing")
|
|
39
90
|
#
|
|
40
|
-
# @
|
|
91
|
+
# @overload find_or_create_by(attributes = nil, options = {}, type = nil)
|
|
92
|
+
# @param [ Hash ] attributes The attributes to search or create with.
|
|
93
|
+
# @param [ Hash ] options The scoped assignment options.
|
|
94
|
+
# @param [ Class ] type The optional type of document to create.
|
|
95
|
+
#
|
|
96
|
+
# @overload find_or_create_by(attributes = nil, type = nil)
|
|
97
|
+
# @param [ Hash ] attributes The attributes to search or create with.
|
|
98
|
+
# @param [ Class ] type The optional type of document to create.
|
|
41
99
|
#
|
|
42
100
|
# @return [ Document ] An existing document or newly created one.
|
|
43
|
-
def find_or_create_by(attrs = {}, &block)
|
|
44
|
-
find_or(:create, attrs, &block)
|
|
101
|
+
def find_or_create_by(attrs = {}, options = {}, type = nil, &block)
|
|
102
|
+
find_or(:create, attrs, options, type, &block)
|
|
45
103
|
end
|
|
46
104
|
|
|
47
105
|
# Find the first +Document+ given the conditions, or instantiates a new document
|
|
@@ -50,11 +108,18 @@ module Mongoid #:nodoc:
|
|
|
50
108
|
# @example Find or initialize.
|
|
51
109
|
# person.posts.find_or_initialize_by(:title => "Test")
|
|
52
110
|
#
|
|
53
|
-
# @
|
|
111
|
+
# @overload find_or_initialize_by(attributes = {}, options = {}, type = nil)
|
|
112
|
+
# @param [ Hash ] attributes The attributes to search or initialize with.
|
|
113
|
+
# @param [ Hash ] options The scoped assignment options.
|
|
114
|
+
# @param [ Class ] type The optional subclass to build.
|
|
115
|
+
#
|
|
116
|
+
# @overload find_or_initialize_by(attributes = {}, type = nil)
|
|
117
|
+
# @param [ Hash ] attributes The attributes to search or initialize with.
|
|
118
|
+
# @param [ Class ] type The optional subclass to build.
|
|
54
119
|
#
|
|
55
120
|
# @return [ Document ] An existing document or newly instantiated one.
|
|
56
|
-
def find_or_initialize_by(attrs = {}, &block)
|
|
57
|
-
find_or(:build, attrs, &block)
|
|
121
|
+
def find_or_initialize_by(attrs = {}, options = {}, type = nil, &block)
|
|
122
|
+
find_or(:build, attrs, options, type, &block)
|
|
58
123
|
end
|
|
59
124
|
|
|
60
125
|
# This proxy can never be nil.
|
|
@@ -136,12 +201,26 @@ module Mongoid #:nodoc:
|
|
|
136
201
|
# @example Find or create|initialize.
|
|
137
202
|
# person.addresses.find_or(:create, :street => "Bond")
|
|
138
203
|
#
|
|
139
|
-
# @
|
|
140
|
-
#
|
|
204
|
+
# @overload find_or(method, attributes = {}, options = {}, type = nil)
|
|
205
|
+
# @param [ Symbol ] method The method name, create or new.
|
|
206
|
+
# @param [ Hash ] attributes The attributes to search or build with.
|
|
207
|
+
# @param [ Hash ] options The scoped assignment options.
|
|
208
|
+
# @param [ Class ] type The optional subclass to build.
|
|
209
|
+
#
|
|
210
|
+
# @overload find_or(attributes = {}, type = nil)
|
|
211
|
+
# @param [ Symbol ] method The method name, create or new.
|
|
212
|
+
# @param [ Hash ] attributes The attributes to search or build with.
|
|
213
|
+
# @param [ Class ] type The optional subclass to build.
|
|
141
214
|
#
|
|
142
215
|
# @return [ Document ] A matching document or a new/created one.
|
|
143
|
-
def find_or(method, attrs = {}, &block)
|
|
144
|
-
|
|
216
|
+
def find_or(method, attrs = {}, options = {}, type = nil, &block)
|
|
217
|
+
if options.is_a? Class
|
|
218
|
+
options, type = {}, options
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
attrs["_type"] = type.to_s if type
|
|
222
|
+
|
|
223
|
+
where(attrs).first || send(method, attrs, options, type, &block)
|
|
145
224
|
end
|
|
146
225
|
end
|
|
147
226
|
end
|