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,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Referenced
|
|
5
5
|
|
|
6
6
|
# This class defines the behaviour for all relations that are a
|
|
7
7
|
# many-to-many between documents in different collections.
|
|
@@ -25,29 +25,52 @@ module Mongoid # :nodoc:
|
|
|
25
25
|
#
|
|
26
26
|
# @since 2.0.0.beta.1
|
|
27
27
|
def <<(*args)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
doc.save
|
|
36
|
-
else
|
|
37
|
-
base.send(metadata.foreign_key).push(doc.id)
|
|
38
|
-
base.synced[metadata.foreign_key] = false
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
if persistable? || _creating?
|
|
42
|
-
base.push_all(metadata.foreign_key, ids)
|
|
43
|
-
base.synced[metadata.foreign_key] = false
|
|
44
|
-
end
|
|
28
|
+
docs = args.flatten
|
|
29
|
+
return concat(docs) if docs.size > 1
|
|
30
|
+
if doc = docs.first
|
|
31
|
+
append(doc)
|
|
32
|
+
base.add_to_set(foreign_key, doc.id)
|
|
33
|
+
if persistable? || _creating?
|
|
34
|
+
doc.save
|
|
45
35
|
end
|
|
46
36
|
end
|
|
37
|
+
unsynced(base, foreign_key) and self
|
|
47
38
|
end
|
|
48
|
-
alias :concat :<<
|
|
49
39
|
alias :push :<<
|
|
50
40
|
|
|
41
|
+
# Appends an array of documents to the relation. Performs a batch
|
|
42
|
+
# insert of the documents instead of persisting one at a time.
|
|
43
|
+
#
|
|
44
|
+
# @example Concat with other documents.
|
|
45
|
+
# person.posts.concat([ post_one, post_two ])
|
|
46
|
+
#
|
|
47
|
+
# @param [ Array<Document> ] documents The docs to add.
|
|
48
|
+
#
|
|
49
|
+
# @return [ Array<Document> ] The documents.
|
|
50
|
+
#
|
|
51
|
+
# @since 2.4.0
|
|
52
|
+
def concat(documents)
|
|
53
|
+
ids, docs, inserts = {}, [], []
|
|
54
|
+
documents.each do |doc|
|
|
55
|
+
next unless doc
|
|
56
|
+
append(doc)
|
|
57
|
+
if persistable? || _creating?
|
|
58
|
+
ids[doc.id] = true
|
|
59
|
+
save_or_delay(doc, docs, inserts)
|
|
60
|
+
else
|
|
61
|
+
existing = base.send(foreign_key)
|
|
62
|
+
unless existing.include?(doc.id)
|
|
63
|
+
existing.push(doc.id) and unsynced(base, foreign_key)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
if persistable? || _creating?
|
|
68
|
+
base.push_all(foreign_key, ids.keys)
|
|
69
|
+
end
|
|
70
|
+
persist_delayed(docs, inserts)
|
|
71
|
+
self
|
|
72
|
+
end
|
|
73
|
+
|
|
51
74
|
# Build a new document from the attributes and append it to this
|
|
52
75
|
# relation without saving.
|
|
53
76
|
#
|
|
@@ -72,13 +95,13 @@ module Mongoid # :nodoc:
|
|
|
72
95
|
options, type = {}, options
|
|
73
96
|
end
|
|
74
97
|
|
|
75
|
-
Factory.build(type || klass, attributes, options)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
98
|
+
doc = Factory.build(type || klass, attributes, options)
|
|
99
|
+
base.send(foreign_key).push(doc.id)
|
|
100
|
+
append(doc)
|
|
101
|
+
doc.apply_post_processed_defaults
|
|
102
|
+
unsynced(doc, inverse_foreign_key)
|
|
103
|
+
yield(doc) if block_given?
|
|
104
|
+
doc
|
|
82
105
|
end
|
|
83
106
|
alias :new :build
|
|
84
107
|
|
|
@@ -95,12 +118,12 @@ module Mongoid # :nodoc:
|
|
|
95
118
|
#
|
|
96
119
|
# @since 2.1.0
|
|
97
120
|
def delete(document)
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
end
|
|
121
|
+
doc = super
|
|
122
|
+
if doc && persistable?
|
|
123
|
+
base.pull(foreign_key, doc.id)
|
|
124
|
+
unsynced(base, foreign_key)
|
|
103
125
|
end
|
|
126
|
+
doc
|
|
104
127
|
end
|
|
105
128
|
|
|
106
129
|
# Removes all associations between the base document and the target
|
|
@@ -113,12 +136,12 @@ module Mongoid # :nodoc:
|
|
|
113
136
|
# @since 2.0.0.rc.1
|
|
114
137
|
def nullify
|
|
115
138
|
unless metadata.forced_nil_inverse?
|
|
116
|
-
criteria.pull(
|
|
139
|
+
criteria.pull(inverse_foreign_key, base.id)
|
|
117
140
|
end
|
|
118
141
|
if persistable?
|
|
119
142
|
base.set(
|
|
120
|
-
|
|
121
|
-
base.send(
|
|
143
|
+
foreign_key,
|
|
144
|
+
base.send(foreign_key).clear
|
|
122
145
|
)
|
|
123
146
|
end
|
|
124
147
|
target.clear do |doc|
|
|
@@ -142,10 +165,9 @@ module Mongoid # :nodoc:
|
|
|
142
165
|
#
|
|
143
166
|
# @since 2.0.0.rc.1
|
|
144
167
|
def substitute(replacement)
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
end
|
|
168
|
+
purge
|
|
169
|
+
push(replacement.compact.uniq) unless replacement.blank?
|
|
170
|
+
self
|
|
149
171
|
end
|
|
150
172
|
|
|
151
173
|
# Get a criteria for the documents without the default scoping
|
|
@@ -158,7 +180,7 @@ module Mongoid # :nodoc:
|
|
|
158
180
|
#
|
|
159
181
|
# @since 2.4.0
|
|
160
182
|
def unscoped
|
|
161
|
-
klass.unscoped.any_in(:
|
|
183
|
+
klass.unscoped.any_in(_id: base.send(foreign_key))
|
|
162
184
|
end
|
|
163
185
|
|
|
164
186
|
private
|
|
@@ -198,7 +220,25 @@ module Mongoid # :nodoc:
|
|
|
198
220
|
#
|
|
199
221
|
# @return [ Criteria ] A new criteria.
|
|
200
222
|
def criteria
|
|
201
|
-
ManyToMany.criteria(metadata, base.send(
|
|
223
|
+
ManyToMany.criteria(metadata, base.send(foreign_key))
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
# Flag the base as unsynced with respect to the foreign key.
|
|
227
|
+
#
|
|
228
|
+
# @api private
|
|
229
|
+
#
|
|
230
|
+
# @example Flag as unsynced.
|
|
231
|
+
# relation.unsynced(doc, :preference_ids)
|
|
232
|
+
#
|
|
233
|
+
# @param [ Document ] doc The document to flag.
|
|
234
|
+
# @param [ Symbol ] key The key to flag on the document.
|
|
235
|
+
#
|
|
236
|
+
# @return [ true ] true.
|
|
237
|
+
#
|
|
238
|
+
# @since 3.0.0
|
|
239
|
+
def unsynced(doc, key)
|
|
240
|
+
doc.synced[key] = false
|
|
241
|
+
true
|
|
202
242
|
end
|
|
203
243
|
|
|
204
244
|
class << self
|
|
@@ -235,7 +275,7 @@ module Mongoid # :nodoc:
|
|
|
235
275
|
#
|
|
236
276
|
# @since 2.1.0
|
|
237
277
|
def criteria(metadata, object, type = nil)
|
|
238
|
-
metadata.klass.
|
|
278
|
+
metadata.klass.all_of(_id: { "$in" => object })
|
|
239
279
|
end
|
|
240
280
|
|
|
241
281
|
# Get the criteria that is used to eager load a relation of this
|
|
@@ -245,13 +285,15 @@ module Mongoid # :nodoc:
|
|
|
245
285
|
# Proxy.eager_load(metadata, criteria)
|
|
246
286
|
#
|
|
247
287
|
# @param [ Metadata ] metadata The relation metadata.
|
|
248
|
-
# @param [
|
|
288
|
+
# @param [ Array<Object> ] ids The ids of the documents to load.
|
|
249
289
|
#
|
|
250
290
|
# @return [ Criteria ] The criteria to eager load the relation.
|
|
251
291
|
#
|
|
252
292
|
# @since 2.2.0
|
|
253
|
-
def eager_load(metadata,
|
|
254
|
-
|
|
293
|
+
def eager_load(metadata, ids)
|
|
294
|
+
metadata.klass.any_in(_id: ids).each do |doc|
|
|
295
|
+
IdentityMap.set(doc)
|
|
296
|
+
end
|
|
255
297
|
end
|
|
256
298
|
|
|
257
299
|
# Returns true if the relation is an embedded one. In this case
|
|
@@ -267,6 +309,20 @@ module Mongoid # :nodoc:
|
|
|
267
309
|
false
|
|
268
310
|
end
|
|
269
311
|
|
|
312
|
+
# Get the foreign key for the provided name.
|
|
313
|
+
#
|
|
314
|
+
# @example Get the foreign key.
|
|
315
|
+
# Referenced::ManyToMany.foreign_key(:person)
|
|
316
|
+
#
|
|
317
|
+
# @param [ Symbol ] name The name.
|
|
318
|
+
#
|
|
319
|
+
# @return [ String ] The foreign key.
|
|
320
|
+
#
|
|
321
|
+
# @since 3.0.0
|
|
322
|
+
def foreign_key(name)
|
|
323
|
+
"#{name.to_s.singularize}#{foreign_key_suffix}"
|
|
324
|
+
end
|
|
325
|
+
|
|
270
326
|
# Get the default value for the foreign key.
|
|
271
327
|
#
|
|
272
328
|
# @example Get the default.
|
|
@@ -297,9 +353,9 @@ module Mongoid # :nodoc:
|
|
|
297
353
|
# @example Get the macro.
|
|
298
354
|
# Referenced::ManyToMany.macro
|
|
299
355
|
#
|
|
300
|
-
# @return [ Symbol ] :
|
|
356
|
+
# @return [ Symbol ] :has_and_belongs_to_many
|
|
301
357
|
def macro
|
|
302
|
-
:
|
|
358
|
+
:has_and_belongs_to_many
|
|
303
359
|
end
|
|
304
360
|
|
|
305
361
|
# Return the nested builder that is responsible for generating the documents
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
|
-
module Mongoid
|
|
3
|
-
module Relations
|
|
4
|
-
module Referenced
|
|
2
|
+
module Mongoid
|
|
3
|
+
module Relations
|
|
4
|
+
module Referenced
|
|
5
5
|
|
|
6
6
|
# This class defines the behaviour for all relations that are a
|
|
7
7
|
# one-to-one between documents in different collections.
|
|
@@ -59,8 +59,7 @@ module Mongoid # :nodoc:
|
|
|
59
59
|
save if persisted?
|
|
60
60
|
end
|
|
61
61
|
end
|
|
62
|
-
|
|
63
|
-
One.new(base, replacement, metadata)
|
|
62
|
+
One.new(base, replacement, metadata) if replacement
|
|
64
63
|
end
|
|
65
64
|
|
|
66
65
|
private
|
|
@@ -122,7 +121,18 @@ module Mongoid # :nodoc:
|
|
|
122
121
|
#
|
|
123
122
|
# @since 2.1.0
|
|
124
123
|
def criteria(metadata, object, type = nil)
|
|
125
|
-
metadata.klass.where(metadata.foreign_key => object)
|
|
124
|
+
crit = metadata.klass.where(metadata.foreign_key => object)
|
|
125
|
+
|
|
126
|
+
if metadata.polymorphic?
|
|
127
|
+
crit = crit.where(metadata.type => type.name)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
inverse_metadata = metadata.inverse_metadata(metadata.klass)
|
|
131
|
+
if inverse_metadata.inverse_of_field
|
|
132
|
+
crit = crit.any_in(inverse_metadata.inverse_of_field => [metadata.name, nil])
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
crit
|
|
126
136
|
end
|
|
127
137
|
|
|
128
138
|
# Get the criteria that is used to eager load a relation of this
|
|
@@ -138,10 +148,7 @@ module Mongoid # :nodoc:
|
|
|
138
148
|
#
|
|
139
149
|
# @since 2.2.0
|
|
140
150
|
def eager_load(metadata, ids)
|
|
141
|
-
|
|
142
|
-
klass.any_in(foreign_key => ids).each do |doc|
|
|
143
|
-
IdentityMap.set_one(doc, foreign_key => doc.send(foreign_key))
|
|
144
|
-
end
|
|
151
|
+
eager_load_ids(metadata, ids) { |doc, key| IdentityMap.set_one(doc, key) }
|
|
145
152
|
end
|
|
146
153
|
|
|
147
154
|
# Returns true if the relation is an embedded one. In this case
|
|
@@ -157,6 +164,20 @@ module Mongoid # :nodoc:
|
|
|
157
164
|
false
|
|
158
165
|
end
|
|
159
166
|
|
|
167
|
+
# Get the foreign key for the provided name.
|
|
168
|
+
#
|
|
169
|
+
# @example Get the foreign key.
|
|
170
|
+
# Referenced::One.foreign_key(:person)
|
|
171
|
+
#
|
|
172
|
+
# @param [ Symbol ] name The name.
|
|
173
|
+
#
|
|
174
|
+
# @return [ String ] The foreign key.
|
|
175
|
+
#
|
|
176
|
+
# @since 3.0.0
|
|
177
|
+
def foreign_key(name)
|
|
178
|
+
"#{name}#{foreign_key_suffix}"
|
|
179
|
+
end
|
|
180
|
+
|
|
160
181
|
# Get the default value for the foreign key.
|
|
161
182
|
#
|
|
162
183
|
# @example Get the default.
|
|
@@ -187,9 +208,9 @@ module Mongoid # :nodoc:
|
|
|
187
208
|
# @example Get the macro.
|
|
188
209
|
# Referenced::One.macro
|
|
189
210
|
#
|
|
190
|
-
# @return [ Symbol ] :
|
|
211
|
+
# @return [ Symbol ] :has_one.
|
|
191
212
|
def macro
|
|
192
|
-
:
|
|
213
|
+
:has_one
|
|
193
214
|
end
|
|
194
215
|
|
|
195
216
|
# Return the nested builder that is responsible for generating the documents
|
|
@@ -254,7 +275,7 @@ module Mongoid # :nodoc:
|
|
|
254
275
|
#
|
|
255
276
|
# @since 2.1.0
|
|
256
277
|
def valid_options
|
|
257
|
-
[ :as, :autosave, :dependent, :foreign_key ]
|
|
278
|
+
[ :as, :autobuild, :autosave, :dependent, :foreign_key ]
|
|
258
279
|
end
|
|
259
280
|
|
|
260
281
|
# 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
|
# The reflections module provides convenience methods that can retrieve
|
|
6
6
|
# useful information about associations.
|
|
@@ -31,7 +31,7 @@ module Mongoid # :nodoc:
|
|
|
31
31
|
self.class.reflect_on_all_associations(*macros)
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
module ClassMethods
|
|
34
|
+
module ClassMethods
|
|
35
35
|
|
|
36
36
|
# Returns the relation metadata for the supplied name.
|
|
37
37
|
#
|
|
@@ -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 handles the behaviour for synchronizing foreign keys between
|
|
6
6
|
# both sides of a many to many relations.
|
|
@@ -36,8 +36,6 @@ module Mongoid # :nodoc:
|
|
|
36
36
|
|
|
37
37
|
# Has the document been synced for the foreign key?
|
|
38
38
|
#
|
|
39
|
-
# @todo Change the sync to be key based.
|
|
40
|
-
#
|
|
41
39
|
# @example Has the document been synced?
|
|
42
40
|
# document.synced?
|
|
43
41
|
#
|
|
@@ -61,7 +59,7 @@ module Mongoid # :nodoc:
|
|
|
61
59
|
#
|
|
62
60
|
# @since 2.2.1
|
|
63
61
|
def remove_inverse_keys(meta)
|
|
64
|
-
meta.criteria(send(meta.foreign_key)).pull(meta.inverse_foreign_key, id)
|
|
62
|
+
meta.criteria(send(meta.foreign_key), self.class).pull(meta.inverse_foreign_key, id)
|
|
65
63
|
end
|
|
66
64
|
|
|
67
65
|
# Update the inverse keys for the relation.
|
|
@@ -91,15 +89,15 @@ module Mongoid # :nodoc:
|
|
|
91
89
|
end
|
|
92
90
|
|
|
93
91
|
unless adds.empty?
|
|
94
|
-
meta.criteria(adds).add_to_set(meta.inverse_foreign_key, id)
|
|
92
|
+
meta.criteria(adds, self.class).add_to_set(meta.inverse_foreign_key, id)
|
|
95
93
|
end
|
|
96
94
|
unless subs.empty?
|
|
97
|
-
meta.criteria(subs).pull(meta.inverse_foreign_key, id)
|
|
95
|
+
meta.criteria(subs, self.class).pull(meta.inverse_foreign_key, id)
|
|
98
96
|
end
|
|
99
97
|
end
|
|
100
98
|
end
|
|
101
99
|
|
|
102
|
-
module ClassMethods
|
|
100
|
+
module ClassMethods
|
|
103
101
|
|
|
104
102
|
# Set up the syncing of many to many foreign keys.
|
|
105
103
|
#
|
|
@@ -133,15 +131,14 @@ module Mongoid # :nodoc:
|
|
|
133
131
|
#
|
|
134
132
|
# @since 2.1.0
|
|
135
133
|
def synced_save(metadata)
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
)
|
|
142
|
-
doc.update_inverse_keys(metadata)
|
|
143
|
-
end
|
|
134
|
+
set_callback(
|
|
135
|
+
:save,
|
|
136
|
+
:after,
|
|
137
|
+
if: ->(doc){ doc.syncable?(metadata) }
|
|
138
|
+
) do |doc|
|
|
139
|
+
doc.update_inverse_keys(metadata)
|
|
144
140
|
end
|
|
141
|
+
self
|
|
145
142
|
end
|
|
146
143
|
|
|
147
144
|
# Set up the sync of inverse keys that needs to happen on a destroy.
|
|
@@ -155,14 +152,13 @@ module Mongoid # :nodoc:
|
|
|
155
152
|
#
|
|
156
153
|
# @since 2.2.1
|
|
157
154
|
def synced_destroy(metadata)
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
)
|
|
163
|
-
doc.remove_inverse_keys(metadata)
|
|
164
|
-
end
|
|
155
|
+
set_callback(
|
|
156
|
+
:destroy,
|
|
157
|
+
:after
|
|
158
|
+
) do |doc|
|
|
159
|
+
doc.remove_inverse_keys(metadata)
|
|
165
160
|
end
|
|
161
|
+
self
|
|
166
162
|
end
|
|
167
163
|
end
|
|
168
164
|
end
|