mongoid 2.0.2 → 2.1.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/README.rdoc +3 -1
- data/Rakefile +3 -2
- data/lib/config/locales/bg.yml +6 -0
- data/lib/config/locales/de.yml +6 -0
- data/lib/config/locales/en-GB.yml +48 -0
- data/lib/config/locales/en.yml +6 -3
- data/lib/config/locales/es.yml +6 -0
- data/lib/config/locales/fr.yml +6 -0
- data/lib/config/locales/hi.yml +39 -0
- data/lib/config/locales/hu.yml +13 -7
- data/lib/config/locales/id.yml +3 -0
- data/lib/config/locales/it.yml +7 -1
- data/lib/config/locales/ja.yml +4 -1
- data/lib/config/locales/kr.yml +9 -34
- data/lib/config/locales/nl.yml +6 -0
- data/lib/config/locales/pl.yml +6 -0
- data/lib/config/locales/pt-BR.yml +6 -0
- data/lib/config/locales/pt.yml +6 -0
- data/lib/config/locales/ro.yml +6 -0
- data/lib/config/locales/ru.yml +6 -0
- data/lib/config/locales/sv.yml +6 -0
- data/lib/config/locales/vi.yml +3 -0
- data/lib/config/locales/zh-CN.yml +6 -0
- data/lib/mongoid.rb +51 -45
- data/lib/mongoid/atomic.rb +145 -0
- data/lib/mongoid/atomic/modifiers.rb +109 -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 +12 -23
- data/lib/mongoid/attributes/processing.rb +5 -5
- data/lib/mongoid/callbacks.rb +2 -0
- data/lib/mongoid/collection.rb +12 -59
- data/lib/mongoid/collections.rb +23 -20
- data/lib/mongoid/collections/master.rb +6 -4
- data/lib/mongoid/collections/operations.rb +1 -0
- data/lib/mongoid/collections/retry.rb +7 -0
- data/lib/mongoid/components.rb +2 -2
- data/lib/mongoid/config.rb +42 -55
- data/lib/mongoid/config/database.rb +6 -2
- data/lib/mongoid/config/replset_database.rb +7 -3
- data/lib/mongoid/contexts.rb +9 -3
- data/lib/mongoid/contexts/enumerable.rb +7 -3
- data/lib/mongoid/contexts/mongo.rb +139 -101
- data/lib/mongoid/criteria.rb +86 -69
- data/lib/mongoid/criterion/complex.rb +32 -5
- data/lib/mongoid/criterion/inclusion.rb +4 -2
- data/lib/mongoid/criterion/optional.rb +111 -86
- data/lib/mongoid/criterion/selector.rb +8 -4
- data/lib/mongoid/cursor.rb +27 -27
- data/lib/mongoid/dirty.rb +54 -214
- data/lib/mongoid/document.rb +37 -39
- data/lib/mongoid/errors/document_not_found.rb +3 -4
- data/lib/mongoid/errors/invalid_collection.rb +2 -3
- data/lib/mongoid/errors/invalid_database.rb +2 -3
- data/lib/mongoid/errors/invalid_field.rb +2 -3
- data/lib/mongoid/errors/invalid_options.rb +19 -7
- data/lib/mongoid/errors/invalid_type.rb +2 -3
- data/lib/mongoid/errors/mongoid_error.rb +5 -6
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
- data/lib/mongoid/errors/unsupported_version.rb +2 -3
- data/lib/mongoid/errors/validations.rb +2 -3
- data/lib/mongoid/extensions.rb +8 -62
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +14 -1
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
- data/lib/mongoid/extensions/hash/scoping.rb +14 -1
- data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
- data/lib/mongoid/extensions/object/reflections.rb +33 -2
- data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
- data/lib/mongoid/extensions/proc/scoping.rb +14 -1
- data/lib/mongoid/extensions/string/conversions.rb +4 -16
- data/lib/mongoid/extensions/string/inflections.rb +35 -14
- data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
- data/lib/mongoid/extensions/true_class/equality.rb +14 -1
- data/lib/mongoid/extras.rb +11 -30
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +121 -29
- data/lib/mongoid/fields/mappings.rb +36 -0
- data/lib/mongoid/fields/serializable.rb +131 -0
- data/lib/mongoid/fields/serializable/array.rb +64 -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 +44 -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 +33 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
- data/lib/mongoid/fields/serializable/hash.rb +25 -0
- data/lib/mongoid/fields/serializable/integer.rb +33 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +32 -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 +28 -0
- data/lib/mongoid/fields/serializable/symbol.rb +28 -0
- data/lib/mongoid/fields/serializable/time.rb +12 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
- data/lib/mongoid/finders.rb +61 -37
- data/lib/mongoid/hierarchy.rb +43 -8
- data/lib/mongoid/identity_map.rb +106 -0
- data/lib/mongoid/indexes.rb +17 -1
- data/lib/mongoid/javascript.rb +2 -3
- data/lib/mongoid/keys.rb +10 -21
- data/lib/mongoid/logger.rb +22 -1
- data/lib/mongoid/matchers/all.rb +10 -0
- data/lib/mongoid/matchers/default.rb +1 -1
- data/lib/mongoid/matchers/exists.rb +10 -0
- data/lib/mongoid/matchers/gt.rb +10 -0
- data/lib/mongoid/matchers/gte.rb +10 -0
- data/lib/mongoid/matchers/in.rb +10 -0
- data/lib/mongoid/matchers/lt.rb +10 -0
- data/lib/mongoid/matchers/lte.rb +10 -0
- data/lib/mongoid/matchers/ne.rb +10 -0
- data/lib/mongoid/matchers/nin.rb +10 -0
- data/lib/mongoid/matchers/or.rb +7 -4
- data/lib/mongoid/matchers/size.rb +10 -0
- data/lib/mongoid/multi_database.rb +26 -6
- data/lib/mongoid/multi_parameter_attributes.rb +40 -17
- data/lib/mongoid/named_scope.rb +1 -2
- data/lib/mongoid/nested_attributes.rb +4 -1
- data/lib/mongoid/observer.rb +108 -5
- data/lib/mongoid/paranoia.rb +26 -26
- data/lib/mongoid/persistence.rb +15 -21
- data/lib/mongoid/persistence/atomic.rb +135 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +9 -6
- data/lib/mongoid/persistence/atomic/operation.rb +48 -7
- 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 +10 -9
- data/lib/mongoid/persistence/atomic/push.rb +8 -5
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/set.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 +214 -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 +53 -0
- data/lib/mongoid/railtie.rb +21 -33
- data/lib/mongoid/railties/database.rake +12 -12
- data/lib/mongoid/relations.rb +9 -5
- data/lib/mongoid/relations/accessors.rb +15 -36
- data/lib/mongoid/relations/auto_save.rb +2 -2
- data/lib/mongoid/relations/binding.rb +28 -1
- data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
- data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
- data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
- data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
- data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
- data/lib/mongoid/relations/builder.rb +4 -2
- data/lib/mongoid/relations/builders.rb +21 -2
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
- data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
- data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
- data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
- data/lib/mongoid/relations/embedded/atomic.rb +2 -2
- data/lib/mongoid/relations/embedded/in.rb +72 -41
- data/lib/mongoid/relations/embedded/many.rb +116 -120
- data/lib/mongoid/relations/embedded/one.rb +59 -41
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +28 -24
- data/lib/mongoid/relations/many.rb +10 -103
- data/lib/mongoid/relations/metadata.rb +335 -38
- data/lib/mongoid/relations/one.rb +7 -32
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/proxy.rb +29 -28
- data/lib/mongoid/relations/referenced/batch.rb +2 -3
- data/lib/mongoid/relations/referenced/in.rb +66 -53
- data/lib/mongoid/relations/referenced/many.rb +216 -143
- data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
- data/lib/mongoid/relations/referenced/one.rb +76 -58
- data/lib/mongoid/relations/synchronization.rb +113 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +329 -0
- data/lib/mongoid/safety.rb +24 -156
- data/lib/mongoid/serialization.rb +21 -0
- data/lib/mongoid/state.rb +34 -0
- data/lib/mongoid/threaded.rb +175 -0
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/validations.rb +3 -7
- data/lib/mongoid/version.rb +1 -1
- data/lib/mongoid/versioning.rb +61 -7
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
- data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
- data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
- data/lib/rails/mongoid.rb +17 -17
- metadata +136 -102
- data/lib/mongoid/atomicity.rb +0 -111
- data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
- data/lib/mongoid/collections/slaves.rb +0 -61
- data/lib/mongoid/extensions/array/conversions.rb +0 -23
- data/lib/mongoid/extensions/array/parentization.rb +0 -13
- data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
- data/lib/mongoid/extensions/binary/conversions.rb +0 -17
- data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
- data/lib/mongoid/extensions/date/conversions.rb +0 -25
- data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
- data/lib/mongoid/extensions/float/conversions.rb +0 -20
- data/lib/mongoid/extensions/hash/conversions.rb +0 -19
- data/lib/mongoid/extensions/integer/conversions.rb +0 -20
- data/lib/mongoid/extensions/object/conversions.rb +0 -25
- data/lib/mongoid/extensions/range/conversions.rb +0 -25
- data/lib/mongoid/extensions/set/conversions.rb +0 -20
- data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
- data/lib/mongoid/extensions/time_conversions.rb +0 -38
- data/lib/mongoid/field.rb +0 -162
- data/lib/mongoid/paths.rb +0 -61
- data/lib/mongoid/persistence/command.rb +0 -71
- data/lib/mongoid/persistence/insert.rb +0 -53
- data/lib/mongoid/persistence/insert_embedded.rb +0 -43
- data/lib/mongoid/persistence/remove.rb +0 -44
- data/lib/mongoid/persistence/remove_all.rb +0 -40
- data/lib/mongoid/persistence/remove_embedded.rb +0 -48
- data/lib/mongoid/persistence/update.rb +0 -77
- data/lib/mongoid/safe.rb +0 -23
- data/lib/mongoid/validations/referenced.rb +0 -58
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
namespace :db do
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
unless Rake::Task.task_defined?("db:drop")
|
|
4
4
|
desc 'Drops all the collections for the database for the current Rails.env'
|
|
5
5
|
task :drop => :environment do
|
|
6
|
-
Mongoid.master.collections.select {|c| c.name !~ /system/ }.each
|
|
6
|
+
Mongoid.master.collections.select {|c| c.name !~ /system/ }.each { |c| c.drop }
|
|
7
7
|
end
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
unless Rake::Task.task_defined?("db:seed")
|
|
11
11
|
# if another ORM has defined db:seed, don't run it twice.
|
|
12
12
|
desc 'Load the seed data from db/seeds.rb'
|
|
13
13
|
task :seed => :environment do
|
|
@@ -16,29 +16,29 @@ namespace :db do
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
unless Rake::Task.task_defined?("db:setup")
|
|
20
20
|
desc 'Create the database, and initialize with the seed data'
|
|
21
21
|
task :setup => [ 'db:create', 'db:mongoid:create_indexes', 'db:seed' ]
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
unless Rake::Task.task_defined?("db:reseed")
|
|
25
25
|
desc 'Delete data and seed'
|
|
26
26
|
task :reseed => [ 'db:drop', 'db:seed' ]
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
unless Rake::Task.task_defined?("db:create")
|
|
30
30
|
task :create => :environment do
|
|
31
31
|
# noop
|
|
32
32
|
end
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
unless Rake::Task.task_defined?("db:migrate")
|
|
36
36
|
task :migrate => :environment do
|
|
37
37
|
# noop
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
unless Rake::Task.task_defined?("db:schema:load")
|
|
42
42
|
namespace :schema do
|
|
43
43
|
task :load do
|
|
44
44
|
# noop
|
|
@@ -46,7 +46,7 @@ namespace :db do
|
|
|
46
46
|
end
|
|
47
47
|
end
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
unless Rake::Task.task_defined?("db:test:prepare")
|
|
50
50
|
namespace :test do
|
|
51
51
|
task :prepare do
|
|
52
52
|
# noop
|
|
@@ -54,7 +54,7 @@ namespace :db do
|
|
|
54
54
|
end
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
unless Rake::Task.task_defined?("db:create_indexes")
|
|
58
58
|
task :create_indexes => "mongoid:create_indexes"
|
|
59
59
|
end
|
|
60
60
|
|
|
@@ -65,7 +65,7 @@ namespace :db do
|
|
|
65
65
|
Dir.glob("app/models/**/*.rb").sort.each do |file|
|
|
66
66
|
model_path = file[0..-4].split('/')[2..-1]
|
|
67
67
|
begin
|
|
68
|
-
klass = model_path.map
|
|
68
|
+
klass = model_path.map { |path| path.camelize }.join('::').constantize
|
|
69
69
|
if klass.ancestors.include?(Mongoid::Document) && !klass.embedded
|
|
70
70
|
documents << klass
|
|
71
71
|
end
|
|
@@ -90,7 +90,7 @@ namespace :db do
|
|
|
90
90
|
convert_ids(v)
|
|
91
91
|
end
|
|
92
92
|
elsif obj.is_a?(Hash)
|
|
93
|
-
obj.
|
|
93
|
+
obj.each_pair do |k, v|
|
|
94
94
|
obj[k] = convert_ids(v)
|
|
95
95
|
end
|
|
96
96
|
else
|
data/lib/mongoid/relations.rb
CHANGED
|
@@ -9,7 +9,9 @@ require "mongoid/relations/bindings"
|
|
|
9
9
|
require "mongoid/relations/builders"
|
|
10
10
|
require "mongoid/relations/many"
|
|
11
11
|
require "mongoid/relations/one"
|
|
12
|
+
require "mongoid/relations/options"
|
|
12
13
|
require "mongoid/relations/polymorphic"
|
|
14
|
+
require "mongoid/relations/targets/enumerable"
|
|
13
15
|
require "mongoid/relations/embedded/atomic"
|
|
14
16
|
require "mongoid/relations/embedded/in"
|
|
15
17
|
require "mongoid/relations/embedded/many"
|
|
@@ -20,6 +22,7 @@ require "mongoid/relations/referenced/many"
|
|
|
20
22
|
require "mongoid/relations/referenced/many_to_many"
|
|
21
23
|
require "mongoid/relations/referenced/one"
|
|
22
24
|
require "mongoid/relations/reflections"
|
|
25
|
+
require "mongoid/relations/synchronization"
|
|
23
26
|
require "mongoid/relations/metadata"
|
|
24
27
|
require "mongoid/relations/macros"
|
|
25
28
|
|
|
@@ -38,6 +41,7 @@ module Mongoid # :nodoc:
|
|
|
38
41
|
include Macros
|
|
39
42
|
include Polymorphic
|
|
40
43
|
include Reflections
|
|
44
|
+
include Synchronization
|
|
41
45
|
|
|
42
46
|
included do
|
|
43
47
|
attr_accessor :metadata
|
|
@@ -53,7 +57,7 @@ module Mongoid # :nodoc:
|
|
|
53
57
|
#
|
|
54
58
|
# @since 2.0.0.rc.1
|
|
55
59
|
def embedded?
|
|
56
|
-
cyclic ? _parent.present? : self.class.embedded?
|
|
60
|
+
@embedded ||= (cyclic ? _parent.present? : self.class.embedded?)
|
|
57
61
|
end
|
|
58
62
|
|
|
59
63
|
# Determine if the document is part of an embeds_many relation.
|
|
@@ -65,7 +69,7 @@ module Mongoid # :nodoc:
|
|
|
65
69
|
#
|
|
66
70
|
# @since 2.0.0.rc.1
|
|
67
71
|
def embedded_many?
|
|
68
|
-
metadata && metadata.macro == :embeds_many
|
|
72
|
+
@embedded_many ||= (metadata && metadata.macro == :embeds_many)
|
|
69
73
|
end
|
|
70
74
|
|
|
71
75
|
# Determine if the document is part of an embeds_one relation.
|
|
@@ -77,7 +81,7 @@ module Mongoid # :nodoc:
|
|
|
77
81
|
#
|
|
78
82
|
# @since 2.0.0.rc.1
|
|
79
83
|
def embedded_one?
|
|
80
|
-
metadata && metadata.macro == :embeds_one
|
|
84
|
+
@embedded_one ||= (metadata && metadata.macro == :embeds_one)
|
|
81
85
|
end
|
|
82
86
|
|
|
83
87
|
# Determine if the document is part of an references_many relation.
|
|
@@ -89,7 +93,7 @@ module Mongoid # :nodoc:
|
|
|
89
93
|
#
|
|
90
94
|
# @since 2.0.0.rc.1
|
|
91
95
|
def referenced_many?
|
|
92
|
-
metadata && metadata.macro == :references_many
|
|
96
|
+
@referenced_many ||= (metadata && metadata.macro == :references_many)
|
|
93
97
|
end
|
|
94
98
|
|
|
95
99
|
# Determine if the document is part of an references_one relation.
|
|
@@ -101,7 +105,7 @@ module Mongoid # :nodoc:
|
|
|
101
105
|
#
|
|
102
106
|
# @since 2.0.0.rc.1
|
|
103
107
|
def referenced_one?
|
|
104
|
-
metadata && metadata.macro == :references_one
|
|
108
|
+
@referenced_one ||= (metadata && metadata.macro == :references_one)
|
|
105
109
|
end
|
|
106
110
|
end
|
|
107
111
|
end
|
|
@@ -23,24 +23,8 @@ module Mongoid # :nodoc:
|
|
|
23
23
|
#
|
|
24
24
|
# @since 2.0.0.rc.1
|
|
25
25
|
def build(name, object, metadata, options = {})
|
|
26
|
-
relation = create_relation(object, metadata)
|
|
27
|
-
|
|
28
|
-
relation.load!(options) if relation && options[:eager]
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Return the options passed to the builders.
|
|
33
|
-
#
|
|
34
|
-
# @example Get the options.
|
|
35
|
-
# person.configurables(document, :continue => true)
|
|
36
|
-
#
|
|
37
|
-
# @param [ Array ] args The arguments to check.
|
|
38
|
-
#
|
|
39
|
-
# @return [ Hash ] The options.
|
|
40
|
-
#
|
|
41
|
-
# @since 2.0.0.rc.1
|
|
42
|
-
def options(args)
|
|
43
|
-
Mongoid.binding_defaults.merge(args.extract_options!)
|
|
26
|
+
relation = create_relation(object, metadata, options[:loading])
|
|
27
|
+
set_relation(name, relation)
|
|
44
28
|
end
|
|
45
29
|
|
|
46
30
|
# Create a relation from an object and metadata.
|
|
@@ -54,9 +38,9 @@ module Mongoid # :nodoc:
|
|
|
54
38
|
# @return [ Proxy ] The relation.
|
|
55
39
|
#
|
|
56
40
|
# @since 2.0.0.rc.1
|
|
57
|
-
def create_relation(object, metadata)
|
|
41
|
+
def create_relation(object, metadata, loading = false)
|
|
58
42
|
type = @attributes[metadata.inverse_type]
|
|
59
|
-
target = metadata.builder(object).build(type)
|
|
43
|
+
target = metadata.builder(object, loading).build(type)
|
|
60
44
|
target ? metadata.relation.new(self, target, metadata) : nil
|
|
61
45
|
end
|
|
62
46
|
|
|
@@ -86,7 +70,7 @@ module Mongoid # :nodoc:
|
|
|
86
70
|
# @return [ Proxy ] The relation.
|
|
87
71
|
#
|
|
88
72
|
# @since 2.0.0.rc.1
|
|
89
|
-
def
|
|
73
|
+
def set_relation(name, relation)
|
|
90
74
|
instance_variable_set("@#{name}", relation)
|
|
91
75
|
end
|
|
92
76
|
|
|
@@ -97,11 +81,11 @@ module Mongoid # :nodoc:
|
|
|
97
81
|
#
|
|
98
82
|
# @param [ String ] name The name of the relation.
|
|
99
83
|
# @param [ Document ] object The document to replace with.
|
|
100
|
-
# @
|
|
84
|
+
# @param [ Hash ] options The options.
|
|
101
85
|
#
|
|
102
86
|
# @since 2.0.0
|
|
103
|
-
def substitute(name, object
|
|
104
|
-
|
|
87
|
+
def substitute(name, object)
|
|
88
|
+
set_relation(name, ivar(name).substitute(object))
|
|
105
89
|
end
|
|
106
90
|
|
|
107
91
|
module ClassMethods #:nodoc:
|
|
@@ -123,16 +107,12 @@ module Mongoid # :nodoc:
|
|
|
123
107
|
tap do
|
|
124
108
|
define_method(name) do |*args|
|
|
125
109
|
reload, variable = args.first, "@#{name}"
|
|
126
|
-
options = options(args)
|
|
127
110
|
if instance_variable_defined?(variable) && !reload
|
|
128
111
|
instance_variable_get(variable)
|
|
129
112
|
else
|
|
130
|
-
|
|
131
|
-
name,
|
|
132
|
-
|
|
133
|
-
metadata,
|
|
134
|
-
options.merge(:binding => true, :eager => metadata.embedded?)
|
|
135
|
-
)
|
|
113
|
+
building do
|
|
114
|
+
build(name, attributes[metadata.key], metadata, :loading => true)
|
|
115
|
+
end
|
|
136
116
|
end
|
|
137
117
|
end
|
|
138
118
|
end
|
|
@@ -155,15 +135,14 @@ module Mongoid # :nodoc:
|
|
|
155
135
|
def setter(name, metadata)
|
|
156
136
|
tap do
|
|
157
137
|
define_method("#{name}=") do |*args|
|
|
158
|
-
object
|
|
159
|
-
variable = "@#{name}"
|
|
138
|
+
object = args.first
|
|
160
139
|
if relation_exists?(name) && !object.is_a?(Hash)
|
|
161
|
-
substitute(name, object
|
|
140
|
+
substitute(name, object)
|
|
162
141
|
else
|
|
163
142
|
if metadata.embedded? && object.blank? && send(name)
|
|
164
|
-
substitute(name, object
|
|
143
|
+
substitute(name, object)
|
|
165
144
|
else
|
|
166
|
-
build(name, object, metadata
|
|
145
|
+
build(name, object, metadata)
|
|
167
146
|
end
|
|
168
147
|
end
|
|
169
148
|
end
|
|
@@ -22,9 +22,9 @@ module Mongoid # :nodoc:
|
|
|
22
22
|
# @since 2.0.0.rc.1
|
|
23
23
|
def autosave(metadata)
|
|
24
24
|
if metadata.autosave?
|
|
25
|
-
set_callback :
|
|
25
|
+
set_callback :save, :after do |document|
|
|
26
26
|
relation = document.send(metadata.name)
|
|
27
|
-
relation.
|
|
27
|
+
relation.in_memory.each { |doc| doc.save } if relation
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
end
|
|
@@ -6,7 +6,34 @@ module Mongoid # :nodoc:
|
|
|
6
6
|
class Binding
|
|
7
7
|
attr_reader :base, :target, :metadata
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
# Execute a block in binding mode.
|
|
10
|
+
#
|
|
11
|
+
# @example Execute in binding mode.
|
|
12
|
+
# binding do
|
|
13
|
+
# relation.push(doc)
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# @return [ Object ] The return value of the block.
|
|
17
|
+
#
|
|
18
|
+
# @since 2.1.0
|
|
19
|
+
def binding
|
|
20
|
+
Threaded.binding = true
|
|
21
|
+
yield
|
|
22
|
+
ensure
|
|
23
|
+
Threaded.binding = false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Is the current thread in binding mode?
|
|
27
|
+
#
|
|
28
|
+
# @example Is the thread in binding mode?
|
|
29
|
+
# binding.binding?
|
|
30
|
+
#
|
|
31
|
+
# @return [ true, false ] If the thread is binding.
|
|
32
|
+
#
|
|
33
|
+
# @since 2.1.0
|
|
34
|
+
def binding?
|
|
35
|
+
Threaded.binding?
|
|
36
|
+
end
|
|
10
37
|
|
|
11
38
|
# Create the new binding.
|
|
12
39
|
#
|
|
@@ -23,25 +23,16 @@ module Mongoid # :nodoc:
|
|
|
23
23
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
24
24
|
#
|
|
25
25
|
# @since 2.0.0.rc.1
|
|
26
|
-
def bind
|
|
27
|
-
|
|
28
|
-
base.metadata = target.reflect_on_association(inverse)
|
|
26
|
+
def bind
|
|
27
|
+
base.metadata = metadata.inverse_metadata(target)
|
|
29
28
|
base.parentize(target)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
inverse
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
).push(base, :binding => true, :continue => false)
|
|
38
|
-
else
|
|
39
|
-
target.do_or_do_not(
|
|
40
|
-
metadata.inverse_setter(target),
|
|
41
|
-
base,
|
|
42
|
-
:binding => true,
|
|
43
|
-
:continue => false
|
|
44
|
-
)
|
|
29
|
+
unless binding?
|
|
30
|
+
binding do
|
|
31
|
+
if base.embedded_many?
|
|
32
|
+
target.do_or_do_not(metadata.inverse(target)).push(base)
|
|
33
|
+
else
|
|
34
|
+
target.do_or_do_not(metadata.inverse_setter(target), base)
|
|
35
|
+
end
|
|
45
36
|
end
|
|
46
37
|
end
|
|
47
38
|
end
|
|
@@ -59,18 +50,14 @@ module Mongoid # :nodoc:
|
|
|
59
50
|
# @option options [ true, false ] :continue Do we continue unbinding?
|
|
60
51
|
#
|
|
61
52
|
# @since 2.0.0.rc.1
|
|
62
|
-
def unbind
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
nil,
|
|
71
|
-
:binding => true,
|
|
72
|
-
:continue => false
|
|
73
|
-
)
|
|
53
|
+
def unbind
|
|
54
|
+
unless binding?
|
|
55
|
+
binding do
|
|
56
|
+
if base.embedded_many?
|
|
57
|
+
target.do_or_do_not(metadata.inverse(target)).delete(base)
|
|
58
|
+
else
|
|
59
|
+
target.do_or_do_not(metadata.inverse_setter(target), nil)
|
|
60
|
+
end
|
|
74
61
|
end
|
|
75
62
|
end
|
|
76
63
|
end
|
|
@@ -23,8 +23,8 @@ module Mongoid # :nodoc:
|
|
|
23
23
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
24
24
|
#
|
|
25
25
|
# @since 2.0.0.rc.1
|
|
26
|
-
def bind
|
|
27
|
-
target.each { |doc| bind_one(doc
|
|
26
|
+
def bind
|
|
27
|
+
target.each { |doc| bind_one(doc) }
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
# Binds a single document with the inverse relation. Used
|
|
@@ -40,16 +40,14 @@ module Mongoid # :nodoc:
|
|
|
40
40
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
41
41
|
#
|
|
42
42
|
# @since 2.0.0.rc.1
|
|
43
|
-
def bind_one(doc
|
|
43
|
+
def bind_one(doc)
|
|
44
44
|
doc.parentize(base)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
:continue => false
|
|
52
|
-
) unless name == "versions="
|
|
45
|
+
unless binding?
|
|
46
|
+
binding do
|
|
47
|
+
unless metadata.versioned?
|
|
48
|
+
doc.do_or_do_not(metadata.inverse_setter(target), base)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
53
51
|
end
|
|
54
52
|
end
|
|
55
53
|
|
|
@@ -66,8 +64,8 @@ module Mongoid # :nodoc:
|
|
|
66
64
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
67
65
|
#
|
|
68
66
|
# @since 2.0.0.rc.1
|
|
69
|
-
def unbind
|
|
70
|
-
target.each { |doc| unbind_one(doc
|
|
67
|
+
def unbind
|
|
68
|
+
target.each { |doc| unbind_one(doc) }
|
|
71
69
|
end
|
|
72
70
|
|
|
73
71
|
# Unbind a single document.
|
|
@@ -81,14 +79,11 @@ module Mongoid # :nodoc:
|
|
|
81
79
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
82
80
|
#
|
|
83
81
|
# @since 2.0.0.rc.1
|
|
84
|
-
def unbind_one(doc
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
metadata.inverse_setter(target),
|
|
88
|
-
|
|
89
|
-
:binding => true,
|
|
90
|
-
:continue => false
|
|
91
|
-
)
|
|
82
|
+
def unbind_one(doc)
|
|
83
|
+
unless binding?
|
|
84
|
+
binding do
|
|
85
|
+
doc.do_or_do_not(metadata.inverse_setter(target), nil)
|
|
86
|
+
end
|
|
92
87
|
end
|
|
93
88
|
end
|
|
94
89
|
end
|
|
@@ -23,14 +23,12 @@ module Mongoid # :nodoc:
|
|
|
23
23
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
24
24
|
#
|
|
25
25
|
# @since 2.0.0.rc.1
|
|
26
|
-
def bind
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
base
|
|
31
|
-
|
|
32
|
-
:continue => false
|
|
33
|
-
)
|
|
26
|
+
def bind
|
|
27
|
+
target.parentize(base)
|
|
28
|
+
unless binding?
|
|
29
|
+
binding do
|
|
30
|
+
target.do_or_do_not(metadata.inverse_setter(target), base)
|
|
31
|
+
end
|
|
34
32
|
end
|
|
35
33
|
end
|
|
36
34
|
alias :bind_one :bind
|
|
@@ -48,14 +46,11 @@ module Mongoid # :nodoc:
|
|
|
48
46
|
# @option options [ true, false ] :binding Are we in build mode?
|
|
49
47
|
#
|
|
50
48
|
# @since 2.0.0.rc.1
|
|
51
|
-
def unbind
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
metadata.inverse_setter(target),
|
|
55
|
-
|
|
56
|
-
:binding => true,
|
|
57
|
-
:continue => false
|
|
58
|
-
)
|
|
49
|
+
def unbind
|
|
50
|
+
unless binding?
|
|
51
|
+
binding do
|
|
52
|
+
target.do_or_do_not(metadata.inverse_setter(target), nil)
|
|
53
|
+
end
|
|
59
54
|
end
|
|
60
55
|
end
|
|
61
56
|
alias :unbind_one :unbind
|