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,8 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Builders
|
|
5
|
+
module Referenced
|
|
6
6
|
class Many < Builder
|
|
7
7
|
|
|
8
8
|
# This builder either takes a hash and queries for the
|
|
@@ -17,8 +17,8 @@ module Mongoid # :nodoc:
|
|
|
17
17
|
def build(type = nil)
|
|
18
18
|
return object unless query?
|
|
19
19
|
return [] if object.is_a?(Array)
|
|
20
|
-
crit = metadata.criteria(Conversions.flag(object, metadata))
|
|
21
|
-
IdentityMap.
|
|
20
|
+
crit = metadata.criteria(Conversions.flag(object, metadata), base.class)
|
|
21
|
+
IdentityMap.get_many(crit.klass, crit.selector) || crit
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Builders
|
|
5
|
+
module Referenced
|
|
6
6
|
class ManyToMany < Builder
|
|
7
7
|
|
|
8
8
|
# This builder either takes a hash and queries for the
|
|
@@ -16,7 +16,9 @@ module Mongoid # :nodoc:
|
|
|
16
16
|
# @return [ Array<Document> ] The documents.
|
|
17
17
|
def build(type = nil)
|
|
18
18
|
return object.try(:dup) unless query?
|
|
19
|
-
|
|
19
|
+
ids = object || []
|
|
20
|
+
crit = metadata.criteria(ids, base.class)
|
|
21
|
+
IdentityMap.get(crit.klass, ids) || crit
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
# Do we need to perform a database query? It will be so if the object we
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Builders
|
|
5
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Builders
|
|
5
|
+
module Referenced
|
|
6
6
|
class One < Builder
|
|
7
7
|
|
|
8
8
|
# This builder either takes an _id or an object and queries for the
|
|
@@ -17,7 +17,7 @@ module Mongoid # :nodoc:
|
|
|
17
17
|
def build(type = nil)
|
|
18
18
|
return object unless query?
|
|
19
19
|
return nil if base.new_record?
|
|
20
|
-
metadata.criteria(Conversions.flag(object, metadata)).from_map_or_db
|
|
20
|
+
metadata.criteria(Conversions.flag(object, metadata), base.class).from_map_or_db
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -11,8 +11,8 @@ require "mongoid/relations/builders/referenced/many"
|
|
|
11
11
|
require "mongoid/relations/builders/referenced/many_to_many"
|
|
12
12
|
require "mongoid/relations/builders/referenced/one"
|
|
13
13
|
|
|
14
|
-
module Mongoid
|
|
15
|
-
module Relations
|
|
14
|
+
module Mongoid
|
|
15
|
+
module Relations
|
|
16
16
|
|
|
17
17
|
# This module is responsible for defining the build and create methods used
|
|
18
18
|
# in one to one relations.
|
|
@@ -49,7 +49,7 @@ module Mongoid # :nodoc:
|
|
|
49
49
|
[ args.first || {}, args.size > 1 ? args[1] : {} ]
|
|
50
50
|
end
|
|
51
51
|
|
|
52
|
-
module ClassMethods
|
|
52
|
+
module ClassMethods
|
|
53
53
|
|
|
54
54
|
# Defines a builder method for an embeds_one relation. This is
|
|
55
55
|
# defined as #build_name.
|
|
@@ -63,15 +63,16 @@ module Mongoid # :nodoc:
|
|
|
63
63
|
#
|
|
64
64
|
# @since 2.0.0.rc.1
|
|
65
65
|
def builder(name, metadata)
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
re_define_method("build_#{name}") do |*args|
|
|
67
|
+
attributes, options = parse_args(*args)
|
|
68
|
+
document = Factory.build(metadata.klass, attributes, options)
|
|
69
|
+
_building do
|
|
70
|
+
child = send("#{name}=", document)
|
|
71
|
+
child.run_callbacks(:build)
|
|
72
|
+
child
|
|
73
73
|
end
|
|
74
74
|
end
|
|
75
|
+
self
|
|
75
76
|
end
|
|
76
77
|
|
|
77
78
|
# Defines a creator method for an embeds_one relation. This is
|
|
@@ -87,13 +88,15 @@ module Mongoid # :nodoc:
|
|
|
87
88
|
#
|
|
88
89
|
# @since 2.0.0.rc.1
|
|
89
90
|
def creator(name, metadata)
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
re_define_method("create_#{name}") do |*args|
|
|
92
|
+
attributes, options = parse_args(*args)
|
|
93
|
+
document = Factory.build(metadata.klass, attributes, options)
|
|
94
|
+
doc = send("#{name}=", document)
|
|
95
|
+
doc.save
|
|
96
|
+
save if new_record? && metadata.stores_foreign_key?
|
|
97
|
+
doc
|
|
96
98
|
end
|
|
99
|
+
self
|
|
97
100
|
end
|
|
98
101
|
end
|
|
99
102
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Cascading
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Cascading
|
|
5
5
|
class Delete
|
|
6
6
|
|
|
7
7
|
attr_accessor :document, :relation, :metadata
|
|
@@ -32,9 +32,7 @@ module Mongoid # :nodoc:
|
|
|
32
32
|
def cascade
|
|
33
33
|
if relation
|
|
34
34
|
if relation.cascades.empty?
|
|
35
|
-
safety = Threaded.safety_options
|
|
36
35
|
relation.clear
|
|
37
|
-
Threaded.safety_options = safety
|
|
38
36
|
else
|
|
39
37
|
::Array.wrap(relation).each { |doc| doc.delete }
|
|
40
38
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Cascading
|
|
5
|
+
class Restrict
|
|
6
|
+
|
|
7
|
+
attr_accessor :document, :relation, :metadata
|
|
8
|
+
|
|
9
|
+
# Initialize the new cascade strategy, which will set up the relation
|
|
10
|
+
# and the metadata.
|
|
11
|
+
#
|
|
12
|
+
# @example Instantiate the strategy
|
|
13
|
+
# Strategy.new(document, metadata)
|
|
14
|
+
#
|
|
15
|
+
# @param [ Document ] document The document to cascade from.
|
|
16
|
+
# @param [ Metadata ] metadata The relation's metadata.
|
|
17
|
+
#
|
|
18
|
+
# @return [ Strategy ] The new strategy.
|
|
19
|
+
def initialize(document, metadata)
|
|
20
|
+
@document, @metadata = document, metadata
|
|
21
|
+
@relation = document.send(metadata.name)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Execute the cascading deletion for the relation if it already exists.
|
|
25
|
+
# This should be optimized in the future potentially not to load all
|
|
26
|
+
# objects from the db.
|
|
27
|
+
#
|
|
28
|
+
# @example Perform the cascading delete.
|
|
29
|
+
# strategy.cascade
|
|
30
|
+
def cascade
|
|
31
|
+
raise Errors::DeleteRestriction.new(document, metadata.name) unless relation.blank?
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
require "mongoid/relations/cascading/delete"
|
|
3
3
|
require "mongoid/relations/cascading/destroy"
|
|
4
4
|
require "mongoid/relations/cascading/nullify"
|
|
5
|
+
require "mongoid/relations/cascading/restrict"
|
|
5
6
|
|
|
6
|
-
module Mongoid
|
|
7
|
-
module Relations
|
|
7
|
+
module Mongoid
|
|
8
|
+
module Relations
|
|
8
9
|
|
|
9
10
|
# This module defines the behaviour for setting up cascading deletes and
|
|
10
11
|
# nullifies for relations, and how to delegate to the approriate strategy.
|
|
@@ -26,14 +27,15 @@ module Mongoid # :nodoc:
|
|
|
26
27
|
def cascade!
|
|
27
28
|
cascades.each do |name|
|
|
28
29
|
if !metadata || !metadata.versioned?
|
|
29
|
-
meta = relations[name]
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
if meta = relations[name]
|
|
31
|
+
strategy = meta.cascade_strategy
|
|
32
|
+
strategy.new(self, meta).cascade
|
|
33
|
+
end
|
|
32
34
|
end
|
|
33
35
|
end
|
|
34
36
|
end
|
|
35
37
|
|
|
36
|
-
module ClassMethods
|
|
38
|
+
module ClassMethods
|
|
37
39
|
|
|
38
40
|
# Attempt to add the cascading information for the document to know how
|
|
39
41
|
# to handle associated documents on a removal.
|
|
@@ -47,7 +49,8 @@ module Mongoid # :nodoc:
|
|
|
47
49
|
#
|
|
48
50
|
# @since 2.0.0.rc.1
|
|
49
51
|
def cascade(metadata)
|
|
50
|
-
|
|
52
|
+
cascades.push(metadata.name.to_s) if metadata.dependent?
|
|
53
|
+
self
|
|
51
54
|
end
|
|
52
55
|
end
|
|
53
56
|
end
|
|
@@ -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
|
# Used for converting foreign key values to the correct type based on the
|
|
6
6
|
# types of ids that the document stores.
|
|
@@ -35,7 +35,8 @@ module Mongoid # :nodoc:
|
|
|
35
35
|
# @since 2.0.0.rc.7
|
|
36
36
|
def convert(object)
|
|
37
37
|
return object if metadata.polymorphic?
|
|
38
|
-
|
|
38
|
+
klass = metadata.klass
|
|
39
|
+
klass.using_object_ids? ? Moped::BSON::ObjectId.mongoize(object) : object
|
|
39
40
|
end
|
|
40
41
|
end
|
|
41
42
|
end
|
|
@@ -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
|
# Contains utility methods for object id conversion.
|
|
6
6
|
module Conversions
|
|
@@ -20,14 +20,13 @@ module Mongoid #:nodoc:
|
|
|
20
20
|
# @since 2.3.0
|
|
21
21
|
def flag(object, metadata)
|
|
22
22
|
inverse = metadata.inverse_klass
|
|
23
|
-
if inverse.using_object_ids? || object.is_a?(BSON::ObjectId)
|
|
23
|
+
if inverse.using_object_ids? || object.is_a?(Moped::BSON::ObjectId)
|
|
24
24
|
object
|
|
25
25
|
else
|
|
26
|
-
object.
|
|
27
|
-
|
|
28
|
-
obj.unconvertable_to_bson = true
|
|
29
|
-
end
|
|
26
|
+
if object.is_a?(String)
|
|
27
|
+
object.unconvertable_to_bson = true
|
|
30
28
|
end
|
|
29
|
+
object
|
|
31
30
|
end
|
|
32
31
|
end
|
|
33
32
|
end
|
|
@@ -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 provides convenience macros for using cyclic embedded
|
|
6
6
|
# relations.
|
|
@@ -11,7 +11,7 @@ module Mongoid # :nodoc:
|
|
|
11
11
|
class_attribute :cyclic
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
module ClassMethods
|
|
14
|
+
module ClassMethods
|
|
15
15
|
|
|
16
16
|
# Create a cyclic embedded relation that creates a tree hierarchy for
|
|
17
17
|
# the document and many embedded child documents.
|
|
@@ -38,9 +38,9 @@ module Mongoid # :nodoc:
|
|
|
38
38
|
def recursively_embeds_many(options = {})
|
|
39
39
|
embeds_many(
|
|
40
40
|
cyclic_child_name,
|
|
41
|
-
options.merge(:
|
|
41
|
+
options.merge(class_name: self.name, cyclic: true)
|
|
42
42
|
)
|
|
43
|
-
embedded_in cyclic_parent_name, :
|
|
43
|
+
embedded_in cyclic_parent_name, class_name: self.name, cyclic: true
|
|
44
44
|
end
|
|
45
45
|
|
|
46
46
|
# Create a cyclic embedded relation that creates a single self
|
|
@@ -68,9 +68,9 @@ module Mongoid # :nodoc:
|
|
|
68
68
|
def recursively_embeds_one(options = {})
|
|
69
69
|
embeds_one(
|
|
70
70
|
cyclic_child_name(false),
|
|
71
|
-
options.merge(:
|
|
71
|
+
options.merge(class_name: self.name, cyclic: true)
|
|
72
72
|
)
|
|
73
|
-
embedded_in cyclic_parent_name, :
|
|
73
|
+
embedded_in cyclic_parent_name, class_name: self.name, cyclic: true
|
|
74
74
|
end
|
|
75
75
|
|
|
76
76
|
private
|