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.
Files changed (240) hide show
  1. data/README.rdoc +3 -1
  2. data/Rakefile +3 -2
  3. data/lib/config/locales/bg.yml +6 -0
  4. data/lib/config/locales/de.yml +6 -0
  5. data/lib/config/locales/en-GB.yml +48 -0
  6. data/lib/config/locales/en.yml +6 -3
  7. data/lib/config/locales/es.yml +6 -0
  8. data/lib/config/locales/fr.yml +6 -0
  9. data/lib/config/locales/hi.yml +39 -0
  10. data/lib/config/locales/hu.yml +13 -7
  11. data/lib/config/locales/id.yml +3 -0
  12. data/lib/config/locales/it.yml +7 -1
  13. data/lib/config/locales/ja.yml +4 -1
  14. data/lib/config/locales/kr.yml +9 -34
  15. data/lib/config/locales/nl.yml +6 -0
  16. data/lib/config/locales/pl.yml +6 -0
  17. data/lib/config/locales/pt-BR.yml +6 -0
  18. data/lib/config/locales/pt.yml +6 -0
  19. data/lib/config/locales/ro.yml +6 -0
  20. data/lib/config/locales/ru.yml +6 -0
  21. data/lib/config/locales/sv.yml +6 -0
  22. data/lib/config/locales/vi.yml +3 -0
  23. data/lib/config/locales/zh-CN.yml +6 -0
  24. data/lib/mongoid.rb +51 -45
  25. data/lib/mongoid/atomic.rb +145 -0
  26. data/lib/mongoid/atomic/modifiers.rb +109 -0
  27. data/lib/mongoid/atomic/paths.rb +3 -0
  28. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  29. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  30. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  31. data/lib/mongoid/atomic/paths/root.rb +40 -0
  32. data/lib/mongoid/attributes.rb +12 -23
  33. data/lib/mongoid/attributes/processing.rb +5 -5
  34. data/lib/mongoid/callbacks.rb +2 -0
  35. data/lib/mongoid/collection.rb +12 -59
  36. data/lib/mongoid/collections.rb +23 -20
  37. data/lib/mongoid/collections/master.rb +6 -4
  38. data/lib/mongoid/collections/operations.rb +1 -0
  39. data/lib/mongoid/collections/retry.rb +7 -0
  40. data/lib/mongoid/components.rb +2 -2
  41. data/lib/mongoid/config.rb +42 -55
  42. data/lib/mongoid/config/database.rb +6 -2
  43. data/lib/mongoid/config/replset_database.rb +7 -3
  44. data/lib/mongoid/contexts.rb +9 -3
  45. data/lib/mongoid/contexts/enumerable.rb +7 -3
  46. data/lib/mongoid/contexts/mongo.rb +139 -101
  47. data/lib/mongoid/criteria.rb +86 -69
  48. data/lib/mongoid/criterion/complex.rb +32 -5
  49. data/lib/mongoid/criterion/inclusion.rb +4 -2
  50. data/lib/mongoid/criterion/optional.rb +111 -86
  51. data/lib/mongoid/criterion/selector.rb +8 -4
  52. data/lib/mongoid/cursor.rb +27 -27
  53. data/lib/mongoid/dirty.rb +54 -214
  54. data/lib/mongoid/document.rb +37 -39
  55. data/lib/mongoid/errors/document_not_found.rb +3 -4
  56. data/lib/mongoid/errors/invalid_collection.rb +2 -3
  57. data/lib/mongoid/errors/invalid_database.rb +2 -3
  58. data/lib/mongoid/errors/invalid_field.rb +2 -3
  59. data/lib/mongoid/errors/invalid_options.rb +19 -7
  60. data/lib/mongoid/errors/invalid_type.rb +2 -3
  61. data/lib/mongoid/errors/mongoid_error.rb +5 -6
  62. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +2 -3
  63. data/lib/mongoid/errors/unsupported_version.rb +2 -3
  64. data/lib/mongoid/errors/validations.rb +2 -3
  65. data/lib/mongoid/extensions.rb +8 -62
  66. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  67. data/lib/mongoid/extensions/false_class/equality.rb +14 -1
  68. data/lib/mongoid/extensions/hash/criteria_helpers.rb +21 -10
  69. data/lib/mongoid/extensions/hash/scoping.rb +14 -1
  70. data/lib/mongoid/extensions/nil/collectionization.rb +12 -1
  71. data/lib/mongoid/extensions/object/reflections.rb +33 -2
  72. data/lib/mongoid/extensions/object_id/conversions.rb +2 -36
  73. data/lib/mongoid/extensions/proc/scoping.rb +14 -1
  74. data/lib/mongoid/extensions/string/conversions.rb +4 -16
  75. data/lib/mongoid/extensions/string/inflections.rb +35 -14
  76. data/lib/mongoid/extensions/symbol/inflections.rb +38 -12
  77. data/lib/mongoid/extensions/true_class/equality.rb +14 -1
  78. data/lib/mongoid/extras.rb +11 -30
  79. data/lib/mongoid/factory.rb +1 -1
  80. data/lib/mongoid/fields.rb +121 -29
  81. data/lib/mongoid/fields/mappings.rb +36 -0
  82. data/lib/mongoid/fields/serializable.rb +131 -0
  83. data/lib/mongoid/fields/serializable/array.rb +64 -0
  84. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  85. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  86. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  87. data/lib/mongoid/fields/serializable/boolean.rb +44 -0
  88. data/lib/mongoid/fields/serializable/date.rb +51 -0
  89. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  90. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  91. data/lib/mongoid/fields/serializable/float.rb +33 -0
  92. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +56 -0
  93. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +43 -0
  94. data/lib/mongoid/fields/serializable/hash.rb +25 -0
  95. data/lib/mongoid/fields/serializable/integer.rb +33 -0
  96. data/lib/mongoid/fields/serializable/object.rb +11 -0
  97. data/lib/mongoid/fields/serializable/object_id.rb +32 -0
  98. data/lib/mongoid/fields/serializable/range.rb +42 -0
  99. data/lib/mongoid/fields/serializable/set.rb +42 -0
  100. data/lib/mongoid/fields/serializable/string.rb +28 -0
  101. data/lib/mongoid/fields/serializable/symbol.rb +28 -0
  102. data/lib/mongoid/fields/serializable/time.rb +12 -0
  103. data/lib/mongoid/fields/serializable/time_with_zone.rb +12 -0
  104. data/lib/mongoid/fields/serializable/timekeeping.rb +102 -0
  105. data/lib/mongoid/finders.rb +61 -37
  106. data/lib/mongoid/hierarchy.rb +43 -8
  107. data/lib/mongoid/identity_map.rb +106 -0
  108. data/lib/mongoid/indexes.rb +17 -1
  109. data/lib/mongoid/javascript.rb +2 -3
  110. data/lib/mongoid/keys.rb +10 -21
  111. data/lib/mongoid/logger.rb +22 -1
  112. data/lib/mongoid/matchers/all.rb +10 -0
  113. data/lib/mongoid/matchers/default.rb +1 -1
  114. data/lib/mongoid/matchers/exists.rb +10 -0
  115. data/lib/mongoid/matchers/gt.rb +10 -0
  116. data/lib/mongoid/matchers/gte.rb +10 -0
  117. data/lib/mongoid/matchers/in.rb +10 -0
  118. data/lib/mongoid/matchers/lt.rb +10 -0
  119. data/lib/mongoid/matchers/lte.rb +10 -0
  120. data/lib/mongoid/matchers/ne.rb +10 -0
  121. data/lib/mongoid/matchers/nin.rb +10 -0
  122. data/lib/mongoid/matchers/or.rb +7 -4
  123. data/lib/mongoid/matchers/size.rb +10 -0
  124. data/lib/mongoid/multi_database.rb +26 -6
  125. data/lib/mongoid/multi_parameter_attributes.rb +40 -17
  126. data/lib/mongoid/named_scope.rb +1 -2
  127. data/lib/mongoid/nested_attributes.rb +4 -1
  128. data/lib/mongoid/observer.rb +108 -5
  129. data/lib/mongoid/paranoia.rb +26 -26
  130. data/lib/mongoid/persistence.rb +15 -21
  131. data/lib/mongoid/persistence/atomic.rb +135 -0
  132. data/lib/mongoid/persistence/atomic/add_to_set.rb +11 -8
  133. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  134. data/lib/mongoid/persistence/atomic/inc.rb +9 -6
  135. data/lib/mongoid/persistence/atomic/operation.rb +48 -7
  136. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  137. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  138. data/lib/mongoid/persistence/atomic/pull_all.rb +10 -9
  139. data/lib/mongoid/persistence/atomic/push.rb +8 -5
  140. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  141. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  142. data/lib/mongoid/persistence/atomic/set.rb +30 -0
  143. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  144. data/lib/mongoid/persistence/deletion.rb +32 -0
  145. data/lib/mongoid/persistence/insertion.rb +41 -0
  146. data/lib/mongoid/persistence/modification.rb +37 -0
  147. data/lib/mongoid/persistence/operations.rb +214 -0
  148. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  149. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  150. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  151. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  152. data/lib/mongoid/persistence/operations/update.rb +53 -0
  153. data/lib/mongoid/railtie.rb +21 -33
  154. data/lib/mongoid/railties/database.rake +12 -12
  155. data/lib/mongoid/relations.rb +9 -5
  156. data/lib/mongoid/relations/accessors.rb +15 -36
  157. data/lib/mongoid/relations/auto_save.rb +2 -2
  158. data/lib/mongoid/relations/binding.rb +28 -1
  159. data/lib/mongoid/relations/bindings/embedded/in.rb +17 -30
  160. data/lib/mongoid/relations/bindings/embedded/many.rb +16 -21
  161. data/lib/mongoid/relations/bindings/embedded/one.rb +11 -16
  162. data/lib/mongoid/relations/bindings/referenced/in.rb +31 -32
  163. data/lib/mongoid/relations/bindings/referenced/many.rb +19 -61
  164. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -63
  165. data/lib/mongoid/relations/bindings/referenced/one.rb +18 -26
  166. data/lib/mongoid/relations/builder.rb +4 -2
  167. data/lib/mongoid/relations/builders.rb +21 -2
  168. data/lib/mongoid/relations/builders/embedded/in.rb +5 -1
  169. data/lib/mongoid/relations/builders/embedded/many.rb +12 -4
  170. data/lib/mongoid/relations/builders/embedded/one.rb +5 -1
  171. data/lib/mongoid/relations/builders/nested_attributes/many.rb +2 -2
  172. data/lib/mongoid/relations/builders/nested_attributes/one.rb +1 -1
  173. data/lib/mongoid/relations/builders/referenced/in.rb +2 -5
  174. data/lib/mongoid/relations/builders/referenced/many.rb +2 -3
  175. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +14 -5
  176. data/lib/mongoid/relations/builders/referenced/one.rb +2 -3
  177. data/lib/mongoid/relations/embedded/atomic.rb +2 -2
  178. data/lib/mongoid/relations/embedded/in.rb +72 -41
  179. data/lib/mongoid/relations/embedded/many.rb +116 -120
  180. data/lib/mongoid/relations/embedded/one.rb +59 -41
  181. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  182. data/lib/mongoid/relations/macros.rb +28 -24
  183. data/lib/mongoid/relations/many.rb +10 -103
  184. data/lib/mongoid/relations/metadata.rb +335 -38
  185. data/lib/mongoid/relations/one.rb +7 -32
  186. data/lib/mongoid/relations/options.rb +47 -0
  187. data/lib/mongoid/relations/proxy.rb +29 -28
  188. data/lib/mongoid/relations/referenced/batch.rb +2 -3
  189. data/lib/mongoid/relations/referenced/in.rb +66 -53
  190. data/lib/mongoid/relations/referenced/many.rb +216 -143
  191. data/lib/mongoid/relations/referenced/many_to_many.rb +132 -163
  192. data/lib/mongoid/relations/referenced/one.rb +76 -58
  193. data/lib/mongoid/relations/synchronization.rb +113 -0
  194. data/lib/mongoid/relations/targets.rb +2 -0
  195. data/lib/mongoid/relations/targets/enumerable.rb +329 -0
  196. data/lib/mongoid/safety.rb +24 -156
  197. data/lib/mongoid/serialization.rb +21 -0
  198. data/lib/mongoid/state.rb +34 -0
  199. data/lib/mongoid/threaded.rb +175 -0
  200. data/lib/mongoid/timestamps/updated.rb +1 -1
  201. data/lib/mongoid/validations.rb +3 -7
  202. data/lib/mongoid/version.rb +1 -1
  203. data/lib/mongoid/versioning.rb +61 -7
  204. data/lib/rack/mongoid.rb +2 -0
  205. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  206. data/lib/rails/generators/mongoid/model/model_generator.rb +1 -1
  207. data/lib/rails/generators/mongoid/model/templates/{model.rb → model.rb.tt} +0 -0
  208. data/lib/rails/generators/mongoid/observer/observer_generator.rb +1 -1
  209. data/lib/rails/generators/mongoid/observer/templates/{observer.rb → observer.rb.tt} +0 -0
  210. data/lib/rails/mongoid.rb +17 -17
  211. metadata +136 -102
  212. data/lib/mongoid/atomicity.rb +0 -111
  213. data/lib/mongoid/collections/cyclic_iterator.rb +0 -34
  214. data/lib/mongoid/collections/slaves.rb +0 -61
  215. data/lib/mongoid/extensions/array/conversions.rb +0 -23
  216. data/lib/mongoid/extensions/array/parentization.rb +0 -13
  217. data/lib/mongoid/extensions/big_decimal/conversions.rb +0 -19
  218. data/lib/mongoid/extensions/binary/conversions.rb +0 -17
  219. data/lib/mongoid/extensions/boolean/conversions.rb +0 -27
  220. data/lib/mongoid/extensions/date/conversions.rb +0 -25
  221. data/lib/mongoid/extensions/datetime/conversions.rb +0 -12
  222. data/lib/mongoid/extensions/float/conversions.rb +0 -20
  223. data/lib/mongoid/extensions/hash/conversions.rb +0 -19
  224. data/lib/mongoid/extensions/integer/conversions.rb +0 -20
  225. data/lib/mongoid/extensions/object/conversions.rb +0 -25
  226. data/lib/mongoid/extensions/range/conversions.rb +0 -25
  227. data/lib/mongoid/extensions/set/conversions.rb +0 -20
  228. data/lib/mongoid/extensions/symbol/conversions.rb +0 -21
  229. data/lib/mongoid/extensions/time_conversions.rb +0 -38
  230. data/lib/mongoid/field.rb +0 -162
  231. data/lib/mongoid/paths.rb +0 -61
  232. data/lib/mongoid/persistence/command.rb +0 -71
  233. data/lib/mongoid/persistence/insert.rb +0 -53
  234. data/lib/mongoid/persistence/insert_embedded.rb +0 -43
  235. data/lib/mongoid/persistence/remove.rb +0 -44
  236. data/lib/mongoid/persistence/remove_all.rb +0 -40
  237. data/lib/mongoid/persistence/remove_embedded.rb +0 -48
  238. data/lib/mongoid/persistence/update.rb +0 -77
  239. data/lib/mongoid/safe.rb +0 -23
  240. data/lib/mongoid/validations/referenced.rb +0 -58
@@ -1,13 +1,13 @@
1
1
  namespace :db do
2
2
 
3
- if not Rake::Task.task_defined?("db:drop")
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(&:drop)
6
+ Mongoid.master.collections.select {|c| c.name !~ /system/ }.each { |c| c.drop }
7
7
  end
8
8
  end
9
9
 
10
- if not Rake::Task.task_defined?("db:seed")
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
- if not Rake::Task.task_defined?("db:setup")
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
- if not Rake::Task.task_defined?("db:reseed")
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
- if not Rake::Task.task_defined?("db:create")
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
- if not Rake::Task.task_defined?("db:migrate")
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
- if not Rake::Task.task_defined?("db:schema:load")
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
- if not Rake::Task.task_defined?("db:test:prepare")
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
- if not Rake::Task.task_defined?("db:create_indexes")
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(&:classify).join('::').constantize
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.each do |k, v|
93
+ obj.each_pair do |k, v|
94
94
  obj[k] = convert_ids(v)
95
95
  end
96
96
  else
@@ -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
- set(name, relation).tap do |relation|
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 set(name, relation)
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
- # @options [ Hash ] options The options.
84
+ # @param [ Hash ] options The options.
101
85
  #
102
86
  # @since 2.0.0
103
- def substitute(name, object, options)
104
- set(name, ivar(name).substitute(object, options))
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
- build(
131
- name,
132
- @attributes[metadata.key],
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, options = args.first, options(args)
159
- variable = "@#{name}"
138
+ object = args.first
160
139
  if relation_exists?(name) && !object.is_a?(Hash)
161
- substitute(name, object, options)
140
+ substitute(name, object)
162
141
  else
163
142
  if metadata.embedded? && object.blank? && send(name)
164
- substitute(name, object, options)
143
+ substitute(name, object)
165
144
  else
166
- build(name, object, metadata, options.merge(:eager => true))
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 :create, :after do |document|
25
+ set_callback :save, :after do |document|
26
26
  relation = document.send(metadata.name)
27
- relation.to_a.each(&:save) if 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
- OPTIONS = { :binding => true, :continue => false }
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(options = {})
27
- inverse = metadata.inverse(target)
28
- base.metadata = target.reflect_on_association(inverse)
26
+ def bind
27
+ base.metadata = metadata.inverse_metadata(target)
29
28
  base.parentize(target)
30
- if options[:continue]
31
- if base.embedded_many?
32
- target.do_or_do_not(
33
- inverse,
34
- false,
35
- :binding => true,
36
- :continue => false
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(options = {})
63
- if options[:continue]
64
- if base.embedded_many?
65
- inverse = metadata.inverse(target)
66
- target.do_or_do_not(inverse).delete(base)
67
- else
68
- target.do_or_do_not(
69
- metadata.inverse_setter(target),
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(options = {})
27
- target.each { |doc| bind_one(doc, options) }
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, options = {})
43
+ def bind_one(doc)
44
44
  doc.parentize(base)
45
- if options[:continue]
46
- name = metadata.inverse_setter(target)
47
- doc.do_or_do_not(
48
- name,
49
- base,
50
- :binding => true,
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(options = {})
70
- target.each { |doc| unbind_one(doc, options) }
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, options = {})
85
- if options[:continue]
86
- doc.do_or_do_not(
87
- metadata.inverse_setter(target),
88
- nil,
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(options = {})
27
- if options[:continue]
28
- target.do_or_do_not(
29
- metadata.inverse_setter(target),
30
- base,
31
- :binding => true,
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(options = {})
52
- if options[:continue]
53
- target.do_or_do_not(
54
- metadata.inverse_setter(target),
55
- nil,
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