mongoid 2.8.1 → 3.0.0.rc
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 +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- 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/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- 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 +50 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -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 +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- 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 +69 -50
- data/lib/mongoid/errors.rb +22 -1
- 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_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/extensions.rb +28 -76
- data/lib/mongoid/extensions/array.rb +127 -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 +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -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 +26 -0
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers.rb +1 -1
- 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/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- 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/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.rb +6 -19
- 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/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- data/lib/mongoid/relations/accessors.rb +119 -19
- 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 +3 -3
- data/lib/mongoid/relations/builders.rb +19 -16
- 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 +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- 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/cascading.rb +6 -4
- 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/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- 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 +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +117 -132
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- 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/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- 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 +59 -19
- 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 +69 -25
- metadata +110 -137
- checksums.yaml +0 -7
- 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.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- 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 -110
- 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 -77
- 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/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.rb +0 -89
- 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/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Relations
|
4
|
-
module Embedded
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
|
+
module Embedded
|
5
5
|
|
6
6
|
# This class defines the behaviour needed for embedded one to one
|
7
7
|
# relations.
|
@@ -35,17 +35,16 @@ module Mongoid # :nodoc:
|
|
35
35
|
#
|
36
36
|
# @since 2.0.0.rc.1
|
37
37
|
def substitute(replacement)
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
proxy.destroy if persistable?
|
43
|
-
end
|
44
|
-
proxy.unbind_one
|
45
|
-
return nil unless replacement
|
46
|
-
proxy.target = replacement
|
47
|
-
proxy.bind_one
|
38
|
+
if _assigning?
|
39
|
+
base.atomic_unsets.push(atomic_path)
|
40
|
+
else
|
41
|
+
delete if persistable?
|
48
42
|
end
|
43
|
+
unbind_one
|
44
|
+
return nil unless replacement
|
45
|
+
self.target = replacement
|
46
|
+
bind_one
|
47
|
+
self
|
49
48
|
end
|
50
49
|
|
51
50
|
private
|
@@ -108,6 +107,18 @@ module Mongoid # :nodoc:
|
|
108
107
|
true
|
109
108
|
end
|
110
109
|
|
110
|
+
# Returns the suffix of the foreign key field, either "_id" or "_ids".
|
111
|
+
#
|
112
|
+
# @example Get the suffix for the foreign key.
|
113
|
+
# Referenced::Many.foreign_key_suffix
|
114
|
+
#
|
115
|
+
# @return [ nil ] nil.
|
116
|
+
#
|
117
|
+
# @since 3.0.0
|
118
|
+
def foreign_key_suffix
|
119
|
+
nil
|
120
|
+
end
|
121
|
+
|
111
122
|
# Returns the macro for this relation. Used mostly as a helper in
|
112
123
|
# reflection.
|
113
124
|
#
|
@@ -184,7 +195,7 @@ module Mongoid # :nodoc:
|
|
184
195
|
#
|
185
196
|
# @since 2.1.0
|
186
197
|
def valid_options
|
187
|
-
[ :as, :cascade_callbacks, :cyclic ]
|
198
|
+
[ :autobuild, :as, :cascade_callbacks, :cyclic, :store_as ]
|
188
199
|
end
|
189
200
|
|
190
201
|
# Get the default validation setting for the relation. Determines if
|
@@ -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,16 +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
|
-
touchable(meta)
|
138
|
-
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
|
139
144
|
end
|
140
|
-
alias :belongs_to_related :belongs_to
|
141
|
-
alias :referenced_in :belongs_to
|
142
145
|
|
143
146
|
# Adds a relational association from a parent Document to many
|
144
147
|
# Documents in another database or collection.
|
@@ -159,15 +162,14 @@ module Mongoid # :nodoc:
|
|
159
162
|
# @param [ Hash ] options The relation options.
|
160
163
|
# @param [ Proc ] block Optional block for defining extensions.
|
161
164
|
def has_many(name, options = {}, &block)
|
162
|
-
characterize(name, Referenced::Many, options, &block)
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
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
|
168
172
|
end
|
169
|
-
alias :has_many_related :has_many
|
170
|
-
alias :references_many :has_many
|
171
173
|
|
172
174
|
# Adds a relational many-to-many association between many of this
|
173
175
|
# Document and many of another Document.
|
@@ -190,15 +192,14 @@ module Mongoid # :nodoc:
|
|
190
192
|
#
|
191
193
|
# @since 2.0.0.rc.1
|
192
194
|
def has_and_belongs_to_many(name, options = {}, &block)
|
193
|
-
characterize(name, Referenced::ManyToMany, options, &block)
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
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
|
200
202
|
end
|
201
|
-
alias :references_and_referenced_in_many :has_and_belongs_to_many
|
202
203
|
|
203
204
|
# Adds a relational association from the child Document to a Document in
|
204
205
|
# another database or collection.
|
@@ -219,20 +220,15 @@ module Mongoid # :nodoc:
|
|
219
220
|
# @param [ Hash ] options The relation options.
|
220
221
|
# @param [ Proc ] block Optional block for defining extensions.
|
221
222
|
def has_one(name, options = {}, &block)
|
222
|
-
|
223
|
-
relate(name, meta)
|
224
|
-
reference(meta)
|
225
|
-
builder(name, meta).creator(name, meta).autosave(meta)
|
226
|
-
validates_relation(meta)
|
227
|
-
end
|
223
|
+
reference_one_to_one(name, options, Referenced::One, &block)
|
228
224
|
end
|
229
|
-
alias :has_one_related :has_one
|
230
|
-
alias :references_one :has_one
|
231
225
|
|
232
226
|
private
|
233
227
|
|
234
228
|
# Create the metadata for the relation.
|
235
229
|
#
|
230
|
+
# @api private
|
231
|
+
#
|
236
232
|
# @example Create the metadata.
|
237
233
|
# Person.characterize(:posts, Referenced::Many, {})
|
238
234
|
#
|
@@ -244,15 +240,17 @@ module Mongoid # :nodoc:
|
|
244
240
|
# @return [ Metadata ] The metadata for the relation.
|
245
241
|
def characterize(name, relation, options, &block)
|
246
242
|
Metadata.new({
|
247
|
-
:
|
248
|
-
:
|
249
|
-
:
|
250
|
-
:
|
243
|
+
relation: relation,
|
244
|
+
extend: create_extension_module(name, &block),
|
245
|
+
inverse_class_name: self.name,
|
246
|
+
name: name
|
251
247
|
}.merge(options))
|
252
248
|
end
|
253
249
|
|
254
250
|
# Generate a named extension module suitable for marshaling
|
255
251
|
#
|
252
|
+
# @api private
|
253
|
+
#
|
256
254
|
# @example Get the module.
|
257
255
|
# Person.create_extension_module(:posts, &block)
|
258
256
|
#
|
@@ -273,9 +271,27 @@ module Mongoid # :nodoc:
|
|
273
271
|
end
|
274
272
|
end
|
275
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
|
+
|
276
290
|
# Defines a field to be used as a foreign key in the relation and
|
277
291
|
# indexes it if defined.
|
278
292
|
#
|
293
|
+
# @api private
|
294
|
+
#
|
279
295
|
# @example Set up the relational fields and indexes.
|
280
296
|
# Person.reference(metadata)
|
281
297
|
#
|
@@ -286,15 +302,43 @@ module Mongoid # :nodoc:
|
|
286
302
|
key = metadata.foreign_key
|
287
303
|
field(
|
288
304
|
key,
|
289
|
-
:
|
290
|
-
:
|
291
|
-
:
|
292
|
-
:
|
305
|
+
type: type,
|
306
|
+
identity: true,
|
307
|
+
metadata: metadata,
|
308
|
+
default: metadata.foreign_key_default
|
293
309
|
)
|
294
|
-
|
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
|
295
317
|
end
|
296
318
|
end
|
297
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
|
+
|
298
342
|
# Creates a relation for the given name, metadata and relation. It adds
|
299
343
|
# the metadata to the relations hash and has the accessors set up.
|
300
344
|
#
|
@@ -305,7 +349,7 @@ module Mongoid # :nodoc:
|
|
305
349
|
# @param [ Metadata ] metadata The metadata for the relation.
|
306
350
|
def relate(name, metadata)
|
307
351
|
self.relations = relations.merge(name.to_s => metadata)
|
308
|
-
getter(name, metadata).setter(name, metadata)
|
352
|
+
getter(name, metadata).setter(name, metadata).existence_check(name, metadata)
|
309
353
|
end
|
310
354
|
end
|
311
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
|