mongoid-multi-db 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 +615 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +49 -0
- data/lib/config/locales/bg.yml +54 -0
- data/lib/config/locales/de.yml +54 -0
- data/lib/config/locales/en-GB.yml +55 -0
- data/lib/config/locales/en.yml +55 -0
- data/lib/config/locales/es.yml +52 -0
- data/lib/config/locales/fr.yml +55 -0
- data/lib/config/locales/hi.yml +46 -0
- data/lib/config/locales/hu.yml +57 -0
- data/lib/config/locales/id.yml +55 -0
- data/lib/config/locales/it.yml +52 -0
- data/lib/config/locales/ja.yml +50 -0
- data/lib/config/locales/kr.yml +47 -0
- data/lib/config/locales/nl.yml +52 -0
- data/lib/config/locales/pl.yml +52 -0
- data/lib/config/locales/pt-BR.yml +53 -0
- data/lib/config/locales/pt.yml +53 -0
- data/lib/config/locales/ro.yml +59 -0
- data/lib/config/locales/ru.yml +54 -0
- data/lib/config/locales/sv.yml +53 -0
- data/lib/config/locales/vi.yml +55 -0
- data/lib/config/locales/zh-CN.yml +46 -0
- data/lib/mongoid.rb +148 -0
- data/lib/mongoid/atomic.rb +230 -0
- data/lib/mongoid/atomic/modifiers.rb +243 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +43 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +40 -0
- data/lib/mongoid/attributes.rb +234 -0
- data/lib/mongoid/attributes/processing.rb +146 -0
- data/lib/mongoid/callbacks.rb +135 -0
- data/lib/mongoid/collection.rb +153 -0
- data/lib/mongoid/collection_proxy.rb +59 -0
- data/lib/mongoid/collections.rb +120 -0
- data/lib/mongoid/collections/master.rb +45 -0
- data/lib/mongoid/collections/operations.rb +44 -0
- data/lib/mongoid/collections/retry.rb +46 -0
- data/lib/mongoid/components.rb +96 -0
- data/lib/mongoid/config.rb +347 -0
- data/lib/mongoid/config/database.rb +186 -0
- data/lib/mongoid/config/replset_database.rb +82 -0
- data/lib/mongoid/connection_proxy.rb +30 -0
- data/lib/mongoid/contexts.rb +25 -0
- data/lib/mongoid/contexts/enumerable.rb +288 -0
- data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
- data/lib/mongoid/contexts/mongo.rb +409 -0
- data/lib/mongoid/copyable.rb +48 -0
- data/lib/mongoid/criteria.rb +418 -0
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/complex.rb +84 -0
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/exclusion.rb +108 -0
- data/lib/mongoid/criterion/inclusion.rb +305 -0
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +232 -0
- data/lib/mongoid/criterion/selector.rb +153 -0
- data/lib/mongoid/cursor.rb +86 -0
- data/lib/mongoid/database_proxy.rb +97 -0
- data/lib/mongoid/default_scope.rb +36 -0
- data/lib/mongoid/dirty.rb +110 -0
- data/lib/mongoid/document.rb +280 -0
- data/lib/mongoid/errors.rb +17 -0
- data/lib/mongoid/errors/callback.rb +26 -0
- data/lib/mongoid/errors/document_not_found.rb +28 -0
- data/lib/mongoid/errors/eager_load.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_database.rb +19 -0
- data/lib/mongoid/errors/invalid_field.rb +18 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_time.rb +25 -0
- data/lib/mongoid/errors/invalid_type.rb +25 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/errors/mongoid_error.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unsaved_document.rb +23 -0
- data/lib/mongoid/errors/unsupported_version.rb +20 -0
- data/lib/mongoid/errors/validations.rb +23 -0
- data/lib/mongoid/extensions.rb +82 -0
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +26 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
- data/lib/mongoid/extensions/hash/scoping.rb +25 -0
- data/lib/mongoid/extensions/integer/checks.rb +23 -0
- data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
- data/lib/mongoid/extensions/object/checks.rb +29 -0
- data/lib/mongoid/extensions/object/reflections.rb +48 -0
- data/lib/mongoid/extensions/object/substitutable.rb +15 -0
- data/lib/mongoid/extensions/object/yoda.rb +44 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
- data/lib/mongoid/extensions/proc/scoping.rb +25 -0
- data/lib/mongoid/extensions/string/checks.rb +36 -0
- data/lib/mongoid/extensions/string/conversions.rb +22 -0
- data/lib/mongoid/extensions/string/inflections.rb +118 -0
- data/lib/mongoid/extensions/symbol/checks.rb +23 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
- data/lib/mongoid/extensions/true_class/equality.rb +26 -0
- data/lib/mongoid/extras.rb +31 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +332 -0
- data/lib/mongoid/fields/mappings.rb +41 -0
- data/lib/mongoid/fields/serializable.rb +201 -0
- data/lib/mongoid/fields/serializable/array.rb +49 -0
- data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
- data/lib/mongoid/fields/serializable/bignum.rb +10 -0
- data/lib/mongoid/fields/serializable/binary.rb +11 -0
- data/lib/mongoid/fields/serializable/boolean.rb +43 -0
- data/lib/mongoid/fields/serializable/date.rb +51 -0
- data/lib/mongoid/fields/serializable/date_time.rb +28 -0
- data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
- data/lib/mongoid/fields/serializable/float.rb +32 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
- data/lib/mongoid/fields/serializable/hash.rb +11 -0
- data/lib/mongoid/fields/serializable/integer.rb +44 -0
- data/lib/mongoid/fields/serializable/localized.rb +41 -0
- data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +31 -0
- data/lib/mongoid/fields/serializable/range.rb +42 -0
- data/lib/mongoid/fields/serializable/set.rb +42 -0
- data/lib/mongoid/fields/serializable/string.rb +27 -0
- data/lib/mongoid/fields/serializable/symbol.rb +27 -0
- data/lib/mongoid/fields/serializable/time.rb +23 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
- data/lib/mongoid/finders.rb +152 -0
- data/lib/mongoid/hierarchy.rb +120 -0
- data/lib/mongoid/identity.rb +92 -0
- data/lib/mongoid/identity_map.rb +119 -0
- data/lib/mongoid/indexes.rb +54 -0
- data/lib/mongoid/inspection.rb +54 -0
- data/lib/mongoid/javascript.rb +20 -0
- data/lib/mongoid/javascript/functions.yml +63 -0
- data/lib/mongoid/json.rb +16 -0
- data/lib/mongoid/keys.rb +144 -0
- data/lib/mongoid/logger.rb +39 -0
- data/lib/mongoid/matchers.rb +32 -0
- data/lib/mongoid/matchers/all.rb +21 -0
- data/lib/mongoid/matchers/and.rb +30 -0
- data/lib/mongoid/matchers/default.rb +70 -0
- data/lib/mongoid/matchers/exists.rb +23 -0
- data/lib/mongoid/matchers/gt.rb +21 -0
- data/lib/mongoid/matchers/gte.rb +21 -0
- data/lib/mongoid/matchers/in.rb +21 -0
- data/lib/mongoid/matchers/lt.rb +21 -0
- data/lib/mongoid/matchers/lte.rb +21 -0
- data/lib/mongoid/matchers/ne.rb +21 -0
- data/lib/mongoid/matchers/nin.rb +21 -0
- data/lib/mongoid/matchers/or.rb +33 -0
- data/lib/mongoid/matchers/size.rb +21 -0
- data/lib/mongoid/matchers/strategies.rb +93 -0
- data/lib/mongoid/multi_database.rb +31 -0
- data/lib/mongoid/multi_parameter_attributes.rb +106 -0
- data/lib/mongoid/named_scope.rb +146 -0
- data/lib/mongoid/nested_attributes.rb +54 -0
- data/lib/mongoid/observer.rb +170 -0
- data/lib/mongoid/paranoia.rb +158 -0
- data/lib/mongoid/persistence.rb +264 -0
- data/lib/mongoid/persistence/atomic.rb +223 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +31 -0
- data/lib/mongoid/persistence/atomic/operation.rb +85 -0
- data/lib/mongoid/persistence/atomic/pop.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
- data/lib/mongoid/persistence/atomic/push.rb +31 -0
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/sets.rb +30 -0
- data/lib/mongoid/persistence/atomic/unset.rb +28 -0
- data/lib/mongoid/persistence/deletion.rb +32 -0
- data/lib/mongoid/persistence/insertion.rb +41 -0
- data/lib/mongoid/persistence/modification.rb +37 -0
- data/lib/mongoid/persistence/operations.rb +211 -0
- data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
- data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
- data/lib/mongoid/persistence/operations/insert.rb +34 -0
- data/lib/mongoid/persistence/operations/remove.rb +33 -0
- data/lib/mongoid/persistence/operations/update.rb +64 -0
- data/lib/mongoid/railtie.rb +126 -0
- data/lib/mongoid/railties/database.rake +182 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +144 -0
- data/lib/mongoid/relations/accessors.rb +138 -0
- data/lib/mongoid/relations/auto_save.rb +38 -0
- data/lib/mongoid/relations/binding.rb +26 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +83 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +26 -0
- data/lib/mongoid/relations/cascading/nullify.rb +18 -0
- data/lib/mongoid/relations/cascading/strategy.rb +26 -0
- data/lib/mongoid/relations/constraint.rb +42 -0
- data/lib/mongoid/relations/conversions.rb +35 -0
- data/lib/mongoid/relations/cyclic.rb +103 -0
- data/lib/mongoid/relations/embedded/atomic.rb +89 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/in.rb +220 -0
- data/lib/mongoid/relations/embedded/many.rb +560 -0
- data/lib/mongoid/relations/embedded/one.rb +206 -0
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +310 -0
- data/lib/mongoid/relations/many.rb +135 -0
- data/lib/mongoid/relations/metadata.rb +919 -0
- data/lib/mongoid/relations/nested_builder.rb +75 -0
- data/lib/mongoid/relations/one.rb +36 -0
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/polymorphic.rb +40 -0
- data/lib/mongoid/relations/proxy.rb +145 -0
- data/lib/mongoid/relations/referenced/batch.rb +72 -0
- data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
- data/lib/mongoid/relations/referenced/in.rb +262 -0
- data/lib/mongoid/relations/referenced/many.rb +623 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
- data/lib/mongoid/relations/referenced/one.rb +272 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +153 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +372 -0
- data/lib/mongoid/reloading.rb +91 -0
- data/lib/mongoid/safety.rb +105 -0
- data/lib/mongoid/scope.rb +31 -0
- data/lib/mongoid/serialization.rb +134 -0
- data/lib/mongoid/sharding.rb +61 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +530 -0
- data/lib/mongoid/threaded/lifecycle.rb +192 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +24 -0
- data/lib/mongoid/timestamps/timeless.rb +50 -0
- data/lib/mongoid/timestamps/updated.rb +26 -0
- data/lib/mongoid/validations.rb +140 -0
- data/lib/mongoid/validations/associated.rb +46 -0
- data/lib/mongoid/validations/uniqueness.rb +145 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +185 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +70 -0
- data/lib/rails/mongoid.rb +91 -0
- metadata +465 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Builders #:nodoc:
|
5
|
+
module NestedAttributes #:nodoc:
|
6
|
+
class One < NestedBuilder
|
7
|
+
|
8
|
+
attr_accessor :destroy
|
9
|
+
|
10
|
+
# Builds the relation depending on the attributes and the options
|
11
|
+
# passed to the macro.
|
12
|
+
#
|
13
|
+
# This attempts to perform 3 operations, either one of an update of
|
14
|
+
# the existing relation, a replacement of the relation with a new
|
15
|
+
# document, or a removal of the relation.
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# <tt>one.build(person)</tt>
|
20
|
+
#
|
21
|
+
# Options:
|
22
|
+
#
|
23
|
+
# parent: The parent document of the relation.
|
24
|
+
def build(parent)
|
25
|
+
return if reject?(parent, attributes)
|
26
|
+
@existing = parent.send(metadata.name)
|
27
|
+
if update?
|
28
|
+
existing.attributes = attributes
|
29
|
+
elsif replace?
|
30
|
+
parent.send(metadata.setter, Mongoid::Factory.build(metadata.klass, attributes))
|
31
|
+
elsif delete?
|
32
|
+
parent.send(metadata.setter, nil)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Create the new builder for nested attributes on one-to-one
|
37
|
+
# relations.
|
38
|
+
#
|
39
|
+
# Example:
|
40
|
+
#
|
41
|
+
# <tt>One.new(metadata, attributes, options)</tt>
|
42
|
+
#
|
43
|
+
# Options:
|
44
|
+
#
|
45
|
+
# metadata: The relation metadata
|
46
|
+
# attributes: The attributes hash to attempt to set.
|
47
|
+
# options: The options defined.
|
48
|
+
#
|
49
|
+
# Returns:
|
50
|
+
#
|
51
|
+
# A new builder.
|
52
|
+
def initialize(metadata, attributes, options)
|
53
|
+
@attributes = attributes.with_indifferent_access
|
54
|
+
@metadata = metadata
|
55
|
+
@options = options
|
56
|
+
@destroy = @attributes.delete(:_destroy)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
# Is the id in the attribtues acceptable for allowing an update to
|
62
|
+
# the existing relation?
|
63
|
+
#
|
64
|
+
# Example:
|
65
|
+
#
|
66
|
+
# <tt>acceptable_id?</tt>
|
67
|
+
#
|
68
|
+
# Returns:
|
69
|
+
#
|
70
|
+
# True if the id part of the logic will allow an update.
|
71
|
+
def acceptable_id?
|
72
|
+
id = convert_id(attributes[:id])
|
73
|
+
existing.id == id || id.nil? || (existing.id != id && update_only?)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Can the existing relation be deleted?
|
77
|
+
#
|
78
|
+
# Example:
|
79
|
+
#
|
80
|
+
# <tt>delete?</tt>
|
81
|
+
#
|
82
|
+
# Returns:
|
83
|
+
#
|
84
|
+
# True if the relation should be deleted.
|
85
|
+
def delete?
|
86
|
+
destroyable? && !attributes[:id].nil?
|
87
|
+
end
|
88
|
+
|
89
|
+
# Can the existing relation potentially be deleted?
|
90
|
+
#
|
91
|
+
# Example:
|
92
|
+
#
|
93
|
+
# <tt>destroyable?({ :_destroy => "1" })</tt>
|
94
|
+
#
|
95
|
+
# Options:
|
96
|
+
#
|
97
|
+
# attributes: The attributes to pull the flag from.
|
98
|
+
#
|
99
|
+
# Returns:
|
100
|
+
#
|
101
|
+
# True if the relation can potentially be deleted.
|
102
|
+
def destroyable?
|
103
|
+
[ 1, "1", true, "true" ].include?(destroy) && allow_destroy?
|
104
|
+
end
|
105
|
+
|
106
|
+
# Is the document to be replaced?
|
107
|
+
#
|
108
|
+
# Example:
|
109
|
+
#
|
110
|
+
# <tt>replace?</tt>
|
111
|
+
#
|
112
|
+
# Returns:
|
113
|
+
#
|
114
|
+
# True if the document should be replaced.
|
115
|
+
def replace?
|
116
|
+
!existing && !destroyable? && !attributes.blank?
|
117
|
+
end
|
118
|
+
|
119
|
+
# Should the document be updated?
|
120
|
+
#
|
121
|
+
# Example:
|
122
|
+
#
|
123
|
+
# <tt>update?</tt>
|
124
|
+
#
|
125
|
+
# Returns:
|
126
|
+
#
|
127
|
+
# True if the object should have its attributes updated.
|
128
|
+
def update?
|
129
|
+
existing && !destroyable? && acceptable_id?
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Builders #:nodoc:
|
5
|
+
module Referenced #:nodoc:
|
6
|
+
class In < Builder
|
7
|
+
|
8
|
+
# This builder either takes a foreign key and queries for the
|
9
|
+
# object or a document, where it will just return it.
|
10
|
+
#
|
11
|
+
# @example Build the document.
|
12
|
+
# Builder.new(meta, attrs).build
|
13
|
+
#
|
14
|
+
# @param [ String ] type The type of document to query for.
|
15
|
+
#
|
16
|
+
# @return [ Document ] A single document.
|
17
|
+
def build(type = nil)
|
18
|
+
return object unless query?
|
19
|
+
model = type ? type.constantize : metadata.klass
|
20
|
+
metadata.criteria(object, model).from_map_or_db
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Builders #:nodoc:
|
5
|
+
module Referenced #:nodoc:
|
6
|
+
class Many < Builder
|
7
|
+
|
8
|
+
# This builder either takes a hash and queries for the
|
9
|
+
# object or an array of documents, where it will just return tem.
|
10
|
+
#
|
11
|
+
# @example Build the documents.
|
12
|
+
# Builder.new(meta, attrs).build
|
13
|
+
#
|
14
|
+
# @param [ String ] type The type of document to query for.
|
15
|
+
#
|
16
|
+
# @return [ Array<Document> ] The documents.
|
17
|
+
def build(type = nil)
|
18
|
+
return object unless query?
|
19
|
+
return [] if object.is_a?(Array)
|
20
|
+
crit = metadata.criteria(Conversions.flag(object, metadata))
|
21
|
+
IdentityMap.get(crit.klass, crit.selector) || crit
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Builders #:nodoc:
|
5
|
+
module Referenced #:nodoc:
|
6
|
+
class ManyToMany < Builder
|
7
|
+
|
8
|
+
# This builder either takes a hash and queries for the
|
9
|
+
# object or an array of documents, where it will just return them.
|
10
|
+
#
|
11
|
+
# @example Build the documents.
|
12
|
+
# Builder.new(meta, attrs).build
|
13
|
+
#
|
14
|
+
# @param [ String ] type The type of document to query for.
|
15
|
+
#
|
16
|
+
# @return [ Array<Document> ] The documents.
|
17
|
+
def build(type = nil)
|
18
|
+
return object.try(:dup) unless query?
|
19
|
+
metadata.criteria(object)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Do we need to perform a database query? It will be so if the object we
|
23
|
+
# have is not a document.
|
24
|
+
#
|
25
|
+
# @example Should we query the database?
|
26
|
+
# builder.query?
|
27
|
+
#
|
28
|
+
# @return [ true, false ] Whether a database query should happen.
|
29
|
+
#
|
30
|
+
# @since 2.0.0.rc.1
|
31
|
+
def query?
|
32
|
+
object.nil? || !object.first.is_a?(Mongoid::Document)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Builders #:nodoc:
|
5
|
+
module Referenced #:nodoc:
|
6
|
+
class One < Builder
|
7
|
+
|
8
|
+
# This builder either takes an _id or an object and queries for the
|
9
|
+
# inverse side using the id or sets the object.
|
10
|
+
#
|
11
|
+
# @example Build the document.
|
12
|
+
# Builder.new(meta, attrs).build
|
13
|
+
#
|
14
|
+
# @param [ String ] type The type of document to query for.
|
15
|
+
#
|
16
|
+
# @return [ Document ] A single document.
|
17
|
+
def build(type = nil)
|
18
|
+
return object unless query?
|
19
|
+
return nil if base.new_record?
|
20
|
+
metadata.criteria(Conversions.flag(object, metadata)).from_map_or_db
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "mongoid/relations/cascading/strategy"
|
3
|
+
require "mongoid/relations/cascading/delete"
|
4
|
+
require "mongoid/relations/cascading/destroy"
|
5
|
+
require "mongoid/relations/cascading/nullify"
|
6
|
+
|
7
|
+
module Mongoid # :nodoc:
|
8
|
+
module Relations #:nodoc:
|
9
|
+
|
10
|
+
# This module defines the behaviour for setting up cascading deletes and
|
11
|
+
# nullifies for relations, and how to delegate to the approriate strategy.
|
12
|
+
module Cascading
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
|
15
|
+
included do
|
16
|
+
class_attribute :cascades
|
17
|
+
self.cascades = []
|
18
|
+
end
|
19
|
+
|
20
|
+
# Perform all cascading deletes, destroys, or nullifies. Will delegate to
|
21
|
+
# the appropriate strategy to perform the operation.
|
22
|
+
#
|
23
|
+
# @example Execute cascades.
|
24
|
+
# document.cascade!
|
25
|
+
#
|
26
|
+
# @since 2.0.0.rc.1
|
27
|
+
def cascade!
|
28
|
+
cascades.each do |name|
|
29
|
+
if !metadata || !metadata.versioned?
|
30
|
+
meta = relations[name]
|
31
|
+
strategy = meta.cascade_strategy
|
32
|
+
strategy.new(self, meta).cascade
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
module ClassMethods #:nodoc:
|
38
|
+
|
39
|
+
# Attempt to add the cascading information for the document to know how
|
40
|
+
# to handle associated documents on a removal.
|
41
|
+
#
|
42
|
+
# @example Set up cascading information
|
43
|
+
# Movie.cascade(metadata)
|
44
|
+
#
|
45
|
+
# @param [ Metadata ] metadata The metadata for the relation.
|
46
|
+
#
|
47
|
+
# @return [ Class ] The class of the document.
|
48
|
+
#
|
49
|
+
# @since 2.0.0.rc.1
|
50
|
+
def cascade(metadata)
|
51
|
+
tap { self.cascades += [ metadata.name.to_s ] if metadata.dependent? }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Cascading #:nodoc:
|
5
|
+
class Delete < Strategy
|
6
|
+
|
7
|
+
# Execute the cascading deletion for the relation if it already exists.
|
8
|
+
# This should be optimized in the future potentially not to load all
|
9
|
+
# objects from the db.
|
10
|
+
#
|
11
|
+
# @example Perform the cascading delete.
|
12
|
+
# strategy.cascade
|
13
|
+
def cascade
|
14
|
+
relation.to_a.each { |doc| doc.delete } if relation
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Cascading #:nodoc:
|
5
|
+
class Destroy < Strategy
|
6
|
+
|
7
|
+
# Execute the cascading deletion for the relation if it already exists.
|
8
|
+
# This should be optimized in the future potentially not to load all
|
9
|
+
# objects from the db.
|
10
|
+
#
|
11
|
+
# @example Perform the cascading destroy.
|
12
|
+
# strategy.cascade
|
13
|
+
def cascade
|
14
|
+
if relation
|
15
|
+
if relation.is_a?(Enumerable)
|
16
|
+
relation.entries
|
17
|
+
relation.each { |doc| doc.destroy }
|
18
|
+
else
|
19
|
+
relation.destroy
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Cascading #:nodoc:
|
5
|
+
class Nullify < Strategy
|
6
|
+
|
7
|
+
# This cascade does not delete the referenced relations, but instead
|
8
|
+
# sets the foreign key values to nil.
|
9
|
+
#
|
10
|
+
# @example Nullify the reference.
|
11
|
+
# strategy.cascade
|
12
|
+
def cascade
|
13
|
+
relation.nullify if relation
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
module Cascading #:nodoc:
|
5
|
+
class Strategy
|
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
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Mongoid # :nodoc:
|
3
|
+
module Relations #:nodoc:
|
4
|
+
|
5
|
+
# Used for converting foreign key values to the correct type based on the
|
6
|
+
# types of ids that the document stores.
|
7
|
+
#
|
8
|
+
# @note Durran: The name of this class is this way to match the metadata
|
9
|
+
# getter, and foreign_key was already taken there.
|
10
|
+
class Constraint
|
11
|
+
attr_reader :metadata
|
12
|
+
|
13
|
+
# Create the new constraint with the metadata.
|
14
|
+
#
|
15
|
+
# @example Instantiate the constraint.
|
16
|
+
# Constraint.new(metdata)
|
17
|
+
#
|
18
|
+
# @param [ Metadata ] metadata The metadata of the relation.
|
19
|
+
#
|
20
|
+
# @since 2.0.0.rc.7
|
21
|
+
def initialize(metadata)
|
22
|
+
@metadata = metadata
|
23
|
+
end
|
24
|
+
|
25
|
+
# Convert the supplied object to the appropriate type to set as the
|
26
|
+
# foreign key for a relation.
|
27
|
+
#
|
28
|
+
# @example Convert the object.
|
29
|
+
# constraint.convert("12345")
|
30
|
+
#
|
31
|
+
# @param [ Object ] object The object to convert.
|
32
|
+
#
|
33
|
+
# @return [ Object ] The object cast to the correct type.
|
34
|
+
#
|
35
|
+
# @since 2.0.0.rc.7
|
36
|
+
def convert(object)
|
37
|
+
return object if metadata.polymorphic?
|
38
|
+
BSON::ObjectId.convert(metadata.klass, object)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|