mongoid 1.9.5 → 2.0.0.alpha

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 (213) hide show
  1. data/.gitignore +6 -0
  2. data/.watchr +29 -0
  3. data/Rakefile +52 -0
  4. data/VERSION +1 -0
  5. data/caliper.yml +4 -0
  6. data/lib/mongoid.rb +20 -9
  7. data/lib/mongoid/associations.rb +100 -123
  8. data/lib/mongoid/associations/belongs_to_related.rb +3 -2
  9. data/lib/mongoid/associations/{embeds_many.rb → embed_many.rb} +29 -90
  10. data/lib/mongoid/associations/{embeds_one.rb → embed_one.rb} +7 -8
  11. data/lib/mongoid/associations/embedded_in.rb +4 -12
  12. data/lib/mongoid/associations/has_many_related.rb +4 -52
  13. data/lib/mongoid/associations/has_one_related.rb +4 -8
  14. data/lib/mongoid/associations/meta_data.rb +1 -2
  15. data/lib/mongoid/associations/options.rb +1 -6
  16. data/lib/mongoid/associations/proxy.rb +21 -14
  17. data/lib/mongoid/attributes.rb +13 -33
  18. data/lib/mongoid/callbacks.rb +11 -16
  19. data/lib/mongoid/collection.rb +3 -4
  20. data/lib/mongoid/collections/master.rb +2 -3
  21. data/lib/mongoid/collections/mimic.rb +46 -0
  22. data/lib/mongoid/collections/slaves.rb +2 -3
  23. data/lib/mongoid/commands.rb +161 -0
  24. data/lib/mongoid/commands/create.rb +19 -0
  25. data/lib/mongoid/commands/delete.rb +16 -0
  26. data/lib/mongoid/commands/delete_all.rb +23 -0
  27. data/lib/mongoid/commands/deletion.rb +18 -0
  28. data/lib/mongoid/commands/destroy.rb +17 -0
  29. data/lib/mongoid/commands/destroy_all.rb +23 -0
  30. data/lib/mongoid/commands/save.rb +29 -0
  31. data/lib/mongoid/components.rb +6 -4
  32. data/lib/mongoid/config.rb +15 -134
  33. data/lib/mongoid/contexts.rb +1 -1
  34. data/lib/mongoid/contexts/enumerable.rb +1 -1
  35. data/lib/mongoid/contexts/mongo.rb +1 -1
  36. data/lib/mongoid/contexts/paging.rb +2 -10
  37. data/lib/mongoid/criterion/inclusion.rb +0 -17
  38. data/lib/mongoid/criterion/optional.rb +1 -1
  39. data/lib/mongoid/cursor.rb +1 -0
  40. data/lib/mongoid/document.rb +45 -49
  41. data/lib/mongoid/errors.rb +1 -32
  42. data/lib/mongoid/extensions.rb +10 -12
  43. data/lib/mongoid/extensions/array/conversions.rb +6 -8
  44. data/lib/mongoid/extensions/big_decimal/conversions.rb +2 -2
  45. data/lib/mongoid/extensions/boolean/conversions.rb +2 -8
  46. data/lib/mongoid/extensions/date/conversions.rb +4 -13
  47. data/lib/mongoid/extensions/datetime/conversions.rb +6 -1
  48. data/lib/mongoid/extensions/float/conversions.rb +1 -5
  49. data/lib/mongoid/extensions/hash/assimilation.rb +3 -12
  50. data/lib/mongoid/extensions/hash/conversions.rb +4 -34
  51. data/lib/mongoid/extensions/integer/conversions.rb +1 -5
  52. data/lib/mongoid/extensions/nil/assimilation.rb +0 -4
  53. data/lib/mongoid/extensions/object/conversions.rb +2 -8
  54. data/lib/mongoid/extensions/objectid/conversions.rb +1 -1
  55. data/lib/mongoid/extensions/string/conversions.rb +1 -1
  56. data/lib/mongoid/extensions/symbol/inflections.rb +1 -1
  57. data/lib/mongoid/extensions/time/conversions.rb +18 -0
  58. data/lib/mongoid/factory.rb +1 -2
  59. data/lib/mongoid/field.rb +2 -9
  60. data/lib/mongoid/fields.rb +7 -11
  61. data/lib/mongoid/finders.rb +2 -2
  62. data/lib/mongoid/identity.rb +4 -4
  63. data/lib/mongoid/indexes.rb +7 -10
  64. data/lib/mongoid/memoization.rb +2 -8
  65. data/lib/mongoid/named_scope.rb +5 -0
  66. data/lib/mongoid/observable.rb +1 -1
  67. data/lib/mongoid/paths.rb +22 -30
  68. data/lib/mongoid/state.rb +21 -28
  69. data/lib/mongoid/timestamps.rb +1 -1
  70. data/lib/mongoid/validations.rb +51 -0
  71. data/lib/mongoid/validations/associated.rb +32 -0
  72. data/lib/mongoid/validations/locale/en.yml +4 -0
  73. data/lib/mongoid/validations/uniqueness.rb +22 -0
  74. data/lib/mongoid/versioning.rb +1 -2
  75. data/mongoid.gemspec +408 -0
  76. data/perf/benchmark.rb +77 -0
  77. data/spec/integration/mongoid/associations_spec.rb +340 -0
  78. data/spec/integration/mongoid/attributes_spec.rb +22 -0
  79. data/spec/integration/mongoid/commands_spec.rb +227 -0
  80. data/spec/integration/mongoid/contexts/enumerable_spec.rb +33 -0
  81. data/spec/integration/mongoid/criteria_spec.rb +272 -0
  82. data/spec/integration/mongoid/document_spec.rb +650 -0
  83. data/spec/integration/mongoid/extensions_spec.rb +22 -0
  84. data/spec/integration/mongoid/finders_spec.rb +119 -0
  85. data/spec/integration/mongoid/inheritance_spec.rb +137 -0
  86. data/spec/integration/mongoid/named_scope_spec.rb +46 -0
  87. data/spec/models/address.rb +39 -0
  88. data/spec/models/animal.rb +6 -0
  89. data/spec/models/callbacks.rb +18 -0
  90. data/spec/models/comment.rb +8 -0
  91. data/spec/models/country_code.rb +6 -0
  92. data/spec/models/employer.rb +5 -0
  93. data/spec/models/game.rb +7 -0
  94. data/spec/models/inheritance.rb +56 -0
  95. data/spec/models/location.rb +5 -0
  96. data/spec/models/mixed_drink.rb +4 -0
  97. data/spec/models/name.rb +13 -0
  98. data/spec/models/namespacing.rb +11 -0
  99. data/spec/models/patient.rb +4 -0
  100. data/spec/models/person.rb +99 -0
  101. data/spec/models/pet.rb +7 -0
  102. data/spec/models/pet_owner.rb +6 -0
  103. data/spec/models/phone.rb +7 -0
  104. data/spec/models/post.rb +15 -0
  105. data/spec/models/translation.rb +5 -0
  106. data/spec/models/vet_visit.rb +5 -0
  107. data/spec/spec.opts +3 -0
  108. data/spec/spec_helper.rb +31 -0
  109. data/spec/unit/mongoid/associations/belongs_to_related_spec.rb +145 -0
  110. data/spec/unit/mongoid/associations/embed_many_spec.rb +516 -0
  111. data/spec/unit/mongoid/associations/embed_one_spec.rb +282 -0
  112. data/spec/unit/mongoid/associations/embedded_in_spec.rb +193 -0
  113. data/spec/unit/mongoid/associations/has_many_related_spec.rb +418 -0
  114. data/spec/unit/mongoid/associations/has_one_related_spec.rb +179 -0
  115. data/spec/unit/mongoid/associations/meta_data_spec.rb +88 -0
  116. data/spec/unit/mongoid/associations/options_spec.rb +192 -0
  117. data/spec/unit/mongoid/associations_spec.rb +595 -0
  118. data/spec/unit/mongoid/attributes_spec.rb +507 -0
  119. data/spec/unit/mongoid/callbacks_spec.rb +55 -0
  120. data/spec/unit/mongoid/collection_spec.rb +187 -0
  121. data/spec/unit/mongoid/collections/cyclic_iterator_spec.rb +75 -0
  122. data/spec/unit/mongoid/collections/master_spec.rb +41 -0
  123. data/spec/unit/mongoid/collections/mimic_spec.rb +43 -0
  124. data/spec/unit/mongoid/collections/slaves_spec.rb +81 -0
  125. data/spec/unit/mongoid/commands/create_spec.rb +31 -0
  126. data/spec/unit/mongoid/commands/delete_all_spec.rb +58 -0
  127. data/spec/unit/mongoid/commands/delete_spec.rb +38 -0
  128. data/spec/unit/mongoid/commands/destroy_all_spec.rb +21 -0
  129. data/spec/unit/mongoid/commands/destroy_spec.rb +51 -0
  130. data/spec/unit/mongoid/commands/save_spec.rb +107 -0
  131. data/spec/unit/mongoid/commands_spec.rb +270 -0
  132. data/spec/unit/mongoid/config_spec.rb +172 -0
  133. data/spec/unit/mongoid/contexts/enumerable_spec.rb +421 -0
  134. data/spec/unit/mongoid/contexts/mongo_spec.rb +682 -0
  135. data/spec/unit/mongoid/contexts_spec.rb +25 -0
  136. data/spec/unit/mongoid/criteria_spec.rb +824 -0
  137. data/spec/unit/mongoid/criterion/complex_spec.rb +19 -0
  138. data/spec/unit/mongoid/criterion/exclusion_spec.rb +91 -0
  139. data/spec/unit/mongoid/criterion/inclusion_spec.rb +219 -0
  140. data/spec/unit/mongoid/criterion/optional_spec.rb +319 -0
  141. data/spec/unit/mongoid/cursor_spec.rb +74 -0
  142. data/spec/unit/mongoid/deprecation_spec.rb +24 -0
  143. data/spec/unit/mongoid/document_spec.rb +818 -0
  144. data/spec/unit/mongoid/errors_spec.rb +103 -0
  145. data/spec/unit/mongoid/extensions/array/accessors_spec.rb +50 -0
  146. data/spec/unit/mongoid/extensions/array/assimilation_spec.rb +24 -0
  147. data/spec/unit/mongoid/extensions/array/conversions_spec.rb +35 -0
  148. data/spec/unit/mongoid/extensions/array/parentization_spec.rb +20 -0
  149. data/spec/unit/mongoid/extensions/big_decimal/conversions_spec.rb +22 -0
  150. data/spec/unit/mongoid/extensions/binary/conversions_spec.rb +22 -0
  151. data/spec/unit/mongoid/extensions/boolean/conversions_spec.rb +49 -0
  152. data/spec/unit/mongoid/extensions/date/conversions_spec.rb +102 -0
  153. data/spec/unit/mongoid/extensions/datetime/conversions_spec.rb +67 -0
  154. data/spec/unit/mongoid/extensions/float/conversions_spec.rb +61 -0
  155. data/spec/unit/mongoid/extensions/hash/accessors_spec.rb +184 -0
  156. data/spec/unit/mongoid/extensions/hash/assimilation_spec.rb +46 -0
  157. data/spec/unit/mongoid/extensions/hash/conversions_spec.rb +21 -0
  158. data/spec/unit/mongoid/extensions/hash/criteria_helpers_spec.rb +17 -0
  159. data/spec/unit/mongoid/extensions/hash/scoping_spec.rb +14 -0
  160. data/spec/unit/mongoid/extensions/integer/conversions_spec.rb +61 -0
  161. data/spec/unit/mongoid/extensions/nil/assimilation_spec.rb +24 -0
  162. data/spec/unit/mongoid/extensions/object/conversions_spec.rb +57 -0
  163. data/spec/unit/mongoid/extensions/proc/scoping_spec.rb +34 -0
  164. data/spec/unit/mongoid/extensions/string/conversions_spec.rb +17 -0
  165. data/spec/unit/mongoid/extensions/string/inflections_spec.rb +208 -0
  166. data/spec/unit/mongoid/extensions/symbol/inflections_spec.rb +91 -0
  167. data/spec/unit/mongoid/extensions/time/conversions_spec.rb +70 -0
  168. data/spec/unit/mongoid/extras_spec.rb +102 -0
  169. data/spec/unit/mongoid/factory_spec.rb +31 -0
  170. data/spec/unit/mongoid/field_spec.rb +143 -0
  171. data/spec/unit/mongoid/fields_spec.rb +181 -0
  172. data/spec/unit/mongoid/finders_spec.rb +404 -0
  173. data/spec/unit/mongoid/identity_spec.rb +109 -0
  174. data/spec/unit/mongoid/indexes_spec.rb +93 -0
  175. data/spec/unit/mongoid/javascript_spec.rb +48 -0
  176. data/spec/unit/mongoid/matchers/all_spec.rb +27 -0
  177. data/spec/unit/mongoid/matchers/default_spec.rb +27 -0
  178. data/spec/unit/mongoid/matchers/exists_spec.rb +56 -0
  179. data/spec/unit/mongoid/matchers/gt_spec.rb +39 -0
  180. data/spec/unit/mongoid/matchers/gte_spec.rb +49 -0
  181. data/spec/unit/mongoid/matchers/in_spec.rb +27 -0
  182. data/spec/unit/mongoid/matchers/lt_spec.rb +39 -0
  183. data/spec/unit/mongoid/matchers/lte_spec.rb +49 -0
  184. data/spec/unit/mongoid/matchers/ne_spec.rb +27 -0
  185. data/spec/unit/mongoid/matchers/nin_spec.rb +27 -0
  186. data/spec/unit/mongoid/matchers/size_spec.rb +27 -0
  187. data/spec/unit/mongoid/matchers_spec.rb +329 -0
  188. data/spec/unit/mongoid/memoization_spec.rb +75 -0
  189. data/spec/unit/mongoid/named_scope_spec.rb +123 -0
  190. data/spec/unit/mongoid/observable_spec.rb +46 -0
  191. data/spec/unit/mongoid/paths_spec.rb +124 -0
  192. data/spec/unit/mongoid/scope_spec.rb +240 -0
  193. data/spec/unit/mongoid/state_spec.rb +83 -0
  194. data/spec/unit/mongoid/timestamps_spec.rb +25 -0
  195. data/spec/unit/mongoid/validations/associated_spec.rb +103 -0
  196. data/spec/unit/mongoid/validations/uniqueness_spec.rb +47 -0
  197. data/spec/unit/mongoid/validations_spec.rb +190 -0
  198. data/spec/unit/mongoid/versioning_spec.rb +41 -0
  199. data/spec/unit/mongoid_spec.rb +46 -0
  200. metadata +316 -110
  201. data/lib/mongoid/collections.rb +0 -41
  202. data/lib/mongoid/concern.rb +0 -31
  203. data/lib/mongoid/dirty.rb +0 -253
  204. data/lib/mongoid/extensions/time_conversions.rb +0 -35
  205. data/lib/mongoid/persistence.rb +0 -222
  206. data/lib/mongoid/persistence/command.rb +0 -39
  207. data/lib/mongoid/persistence/insert.rb +0 -50
  208. data/lib/mongoid/persistence/insert_embedded.rb +0 -38
  209. data/lib/mongoid/persistence/remove.rb +0 -39
  210. data/lib/mongoid/persistence/remove_all.rb +0 -37
  211. data/lib/mongoid/persistence/remove_embedded.rb +0 -50
  212. data/lib/mongoid/persistence/update.rb +0 -63
  213. data/lib/mongoid/version.rb +0 -4
@@ -0,0 +1,6 @@
1
+ .DS_STORE
2
+ coverage/*
3
+ pkg/*
4
+ scratch_directory/*
5
+ tmp/*
6
+ *.gem
data/.watchr ADDED
@@ -0,0 +1,29 @@
1
+ # Watchr is the preferred method to run specs automatically over rspactor for
2
+ # Mongoid. If you are using vim, you can add the file:
3
+ #
4
+ # ~/.vim/ftdetect/watchr.vim
5
+ #
6
+ # This should have only the following line in it:
7
+ #
8
+ # autocmd BufNewFile,BufRead *.watchr setf ruby
9
+ #
10
+ # This will enable vim to recognize this file as ruby code should you wish to
11
+ # edit it.
12
+ def run(cmd)
13
+ puts cmd
14
+ system cmd
15
+ end
16
+
17
+ def spec(file)
18
+ run "spec -O spec/spec.opts #{file}"
19
+ end
20
+
21
+ watch("spec/.*/*_spec\.rb") do |match|
22
+ p match[0]
23
+ spec(match[0])
24
+ end
25
+
26
+ watch("lib/(.*/.*)\.rb") do |match|
27
+ p match[1]
28
+ spec("spec/unit/#{match[1]}_spec.rb")
29
+ end
@@ -0,0 +1,52 @@
1
+ require "rubygems"
2
+ require "rake"
3
+ require "rake/rdoctask"
4
+ require "spec/rake/spectask"
5
+
6
+ begin
7
+ require "jeweler"
8
+ Jeweler::Tasks.new do |gem|
9
+ gem.name = "mongoid"
10
+ gem.summary = "ODM framework for MongoDB"
11
+ gem.email = "durran@gmail.com"
12
+ gem.homepage = "http://mongoid.org"
13
+ gem.authors = ["Durran Jordan"]
14
+
15
+ gem.add_dependency("activemodel", ">= 3.0.pre")
16
+ gem.add_dependency("will_paginate", ">= 3.0.pre")
17
+ gem.add_dependency("mongo", ">= 0.19.1")
18
+
19
+ gem.add_development_dependency("rspec", ">= 1.3.0")
20
+ gem.add_development_dependency("mocha", ">= 0.9.8")
21
+ end
22
+ Jeweler::GemcutterTasks.new
23
+ rescue LoadError
24
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
25
+ end
26
+
27
+ Spec::Rake::SpecTask.new(:spec) do |spec|
28
+ spec.pattern = "spec/**/*_spec.rb"
29
+ spec.spec_opts = ["--options", "spec/spec.opts"]
30
+ end
31
+
32
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
33
+ spec.libs << "lib" << "spec"
34
+ spec.pattern = "spec/**/*_spec.rb"
35
+ spec.spec_opts = ["--options", "spec/spec.opts"]
36
+ spec.rcov = true
37
+ end
38
+
39
+ Rake::RDocTask.new do |rdoc|
40
+ if File.exist?("VERSION.yml")
41
+ config = File.read("VERSION")
42
+ version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
43
+ else
44
+ version = ""
45
+ end
46
+ rdoc.rdoc_dir = "rdoc"
47
+ rdoc.title = "mongoid #{version}"
48
+ rdoc.rdoc_files.include("README*")
49
+ rdoc.rdoc_files.include("lib/**/*.rb")
50
+ end
51
+
52
+ task :default => ["spec"]
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 2.0.0.alpha
@@ -0,0 +1,4 @@
1
+ test_directories_to_calculate:
2
+ - spec/unit
3
+ - spec/integration
4
+ - spec/integration/mongoid
@@ -19,29 +19,41 @@
19
19
  # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
20
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ require "rubygems"
23
+
24
+ gem "activemodel", ">= 3.0.pre"
25
+ gem "will_paginate", ">= 3.0.pre"
26
+ gem "mongo", ">= 0.19.1"
27
+
22
28
  require "delegate"
23
29
  require "singleton"
24
30
  require "time"
25
- require "validatable"
26
- require "active_support/callbacks"
27
31
  require "active_support/core_ext"
32
+ require 'active_support/json'
28
33
  require "active_support/inflector"
29
34
  require "active_support/time_with_zone"
35
+ require "active_model"
36
+ require "active_model/callbacks"
37
+ require "active_model/conversion"
38
+ require "active_model/deprecated_error_methods"
39
+ require "active_model/errors"
40
+ require "active_model/naming"
41
+ require "active_model/serialization"
42
+ require "active_model/translation"
43
+ require "active_model/validator"
44
+ require "active_model/validations"
30
45
  require "will_paginate/collection"
31
46
  require "mongo"
32
- require "mongoid/concern"
33
- require "mongoid/observable"
34
47
  require "mongoid/associations"
35
48
  require "mongoid/attributes"
36
49
  require "mongoid/callbacks"
37
50
  require "mongoid/collection"
38
- require "mongoid/collections"
51
+ require "mongoid/commands"
39
52
  require "mongoid/config"
40
53
  require "mongoid/contexts"
41
54
  require "mongoid/criteria"
42
55
  require "mongoid/cursor"
43
56
  require "mongoid/deprecation"
44
- require "mongoid/dirty"
45
57
  require "mongoid/extensions"
46
58
  require "mongoid/extras"
47
59
  require "mongoid/errors"
@@ -55,19 +67,18 @@ require "mongoid/javascript"
55
67
  require "mongoid/matchers"
56
68
  require "mongoid/memoization"
57
69
  require "mongoid/named_scope"
70
+ require "mongoid/observable"
58
71
  require "mongoid/paths"
59
- require "mongoid/persistence"
60
72
  require "mongoid/scope"
61
73
  require "mongoid/state"
62
74
  require "mongoid/timestamps"
75
+ require "mongoid/validations"
63
76
  require "mongoid/versioning"
64
77
  require "mongoid/components"
65
78
  require "mongoid/document"
66
79
 
67
80
  module Mongoid #:nodoc
68
81
 
69
- MONGODB_VERSION = "1.4.0"
70
-
71
82
  class << self
72
83
 
73
84
  # Sets the Mongoid configuration options. Best used by passing a block.
@@ -2,8 +2,8 @@
2
2
  require "mongoid/associations/proxy"
3
3
  require "mongoid/associations/belongs_to_related"
4
4
  require "mongoid/associations/embedded_in"
5
- require "mongoid/associations/embeds_many"
6
- require "mongoid/associations/embeds_one"
5
+ require "mongoid/associations/embed_many"
6
+ require "mongoid/associations/embed_one"
7
7
  require "mongoid/associations/has_many_related"
8
8
  require "mongoid/associations/has_one_related"
9
9
  require "mongoid/associations/options"
@@ -13,13 +13,9 @@ module Mongoid # :nodoc:
13
13
  module Associations #:nodoc:
14
14
  extend ActiveSupport::Concern
15
15
  included do
16
- cattr_accessor :embedded
17
- self.embedded = false
18
-
16
+ # Associations need to inherit down the chain.
19
17
  class_inheritable_accessor :associations
20
18
  self.associations = {}
21
-
22
- delegate :embedded, :embedded?, :to => "self.class"
23
19
  end
24
20
 
25
21
  module InstanceMethods
@@ -28,15 +24,9 @@ module Mongoid # :nodoc:
28
24
  self.class.associations
29
25
  end
30
26
 
31
- # are we in an embeds_many?
32
- def embedded_many?
33
- embedded? and _parent.associations[association_name].association == EmbedsMany
34
- end
35
-
36
- # Update all the dirty child documents after an update.
37
- def update_embedded(name)
38
- association = send(name)
39
- association.to_a.each { |doc| doc.save if doc.changed? || doc.new_record? } unless association.blank?
27
+ # Updates all the one-to-many relational associations for the name.
28
+ def update_associations(name)
29
+ send(name).each { |doc| doc.save } if new_record?
40
30
  end
41
31
 
42
32
  # Update the one-to-one relational association for the name.
@@ -44,46 +34,14 @@ module Mongoid # :nodoc:
44
34
  association = send(name)
45
35
  association.save if new_record? && !association.nil?
46
36
  end
47
-
48
- # Updates all the one-to-many relational associations for the name.
49
- def update_associations(name)
50
- send(name).each { |doc| doc.save } if new_record?
51
- end
52
37
  end
53
38
 
54
39
  module ClassMethods
55
- # Adds a relational association from the child Document to a Document in
56
- # another database or collection.
57
- #
58
- # Options:
59
- #
60
- # name: A +Symbol+ that is the related class name.
61
- #
62
- # Example:
63
- #
64
- # class Game
65
- # include Mongoid::Document
66
- # belongs_to_related :person
67
- # end
68
- #
69
- def belongs_to_related(name, options = {}, &block)
70
- opts = optionize(name, options, fk(name, options), &block)
71
- associate(Associations::BelongsToRelated, opts)
72
- field(opts.foreign_key, :type => Mongoid.use_object_ids ? BSON::ObjectId : String)
73
- index(opts.foreign_key) unless embedded?
74
- end
75
40
 
76
- # Gets whether or not the document is embedded.
77
- #
78
- # Example:
79
- #
80
- # <tt>Person.embedded?</tt>
81
- #
82
- # Returns:
83
- #
84
- # <tt>true</tt> if embedded, <tt>false</tt> if not.
85
- def embedded?
86
- !!self.embedded
41
+ # Deprecated: Document.belongs_to will become Document.embedded_in
42
+ def belongs_to(name, options = {}, &block)
43
+ Mongoid.deprecate("Document.belongs_to will become Document.embedded_in")
44
+ embedded_in(name, options, &block)
87
45
  end
88
46
 
89
47
  # Adds the association back to the parent document. This macro is
@@ -99,7 +57,7 @@ module Mongoid # :nodoc:
99
57
  #
100
58
  # class Person
101
59
  # include Mongoid::Document
102
- # embeds_many :addresses
60
+ # embed_many :addresses
103
61
  # end
104
62
  #
105
63
  # class Address
@@ -108,47 +66,48 @@ module Mongoid # :nodoc:
108
66
  # end
109
67
  def embedded_in(name, options = {}, &block)
110
68
  unless options.has_key?(:inverse_of)
111
- raise Errors::InvalidOptions.new("Options for embedded_in association must include :inverse_of")
69
+ raise Errors::InvalidOptions.new("Options for belongs_to association must include :inverse_of")
112
70
  end
113
71
  self.embedded = true
114
- associate(Associations::EmbeddedIn, optionize(name, options, nil, &block))
72
+ add_association(
73
+ Associations::EmbeddedIn,
74
+ Associations::Options.new(
75
+ options.merge(:name => name, :extend => block)
76
+ )
77
+ )
115
78
  end
116
79
 
117
- alias :belongs_to :embedded_in
118
-
119
- # Adds the association from a parent document to its children. The name
120
- # of the association needs to be a pluralized form of the child class
121
- # name.
80
+ # Adds a relational association from the child Document to a Document in
81
+ # another database or collection.
122
82
  #
123
83
  # Options:
124
84
  #
125
- # name: A +Symbol+ that is the plural child class name.
85
+ # name: A +Symbol+ that is the related class name.
126
86
  #
127
87
  # Example:
128
88
  #
129
- # class Person
89
+ # class Game
130
90
  # include Mongoid::Document
131
- # embeds_many :addresses
91
+ # belongs_to_related :person
132
92
  # end
133
93
  #
134
- # class Address
135
- # include Mongoid::Document
136
- # embedded_in :person, :inverse_of => :addresses
137
- # end
138
- def embeds_many(name, options = {}, &block)
139
- associate(Associations::EmbedsMany, optionize(name, options, nil, &block))
140
- unless name == :versions
141
- after_update do |document|
142
- document.update_embedded(name)
143
- end
144
- end
94
+ def belongs_to_related(name, options = {}, &block)
95
+ opts = Associations::Options.new(
96
+ options.merge(:name => name, :extend => block, :foreign_key => foreign_key(name, options))
97
+ )
98
+ add_association(Associations::BelongsToRelated, opts)
99
+ field(opts.foreign_key, :type => Mongoid.use_object_ids ? Mongo::ObjectID : String)
100
+ index(opts.foreign_key) unless self.embedded
145
101
  end
146
102
 
147
- alias :embed_many :embeds_many
148
- alias :has_many :embeds_many
103
+ # Deprecated: Document.has_many will become Document.embed_many
104
+ def has_many(name, options = {}, &block)
105
+ Mongoid.deprecate("Document.has_many will become Document.embed_many")
106
+ embed_many(name, options, &block)
107
+ end
149
108
 
150
- # Adds the association from a parent document to its child. The name
151
- # of the association needs to be a singular form of the child class
109
+ # Adds the association from a parent document to its children. The name
110
+ # of the association needs to be a pluralized form of the child class
152
111
  # name.
153
112
  #
154
113
  # Options:
@@ -159,27 +118,22 @@ module Mongoid # :nodoc:
159
118
  #
160
119
  # class Person
161
120
  # include Mongoid::Document
162
- # embeds_one :name
121
+ # embed_many :addresses
163
122
  # end
164
123
  #
165
- # class Name
124
+ # class Address
166
125
  # include Mongoid::Document
167
- # embedded_in :person
126
+ # embedded_in :person, :inverse_of => :addresses
168
127
  # end
169
- def embeds_one(name, options = {}, &block)
170
- opts = optionize(name, options, nil, &block)
171
- type = Associations::EmbedsOne
172
- associate(type, opts)
173
- add_builder(type, opts)
174
- add_creator(type, opts)
175
- after_update do |document|
176
- document.update_embedded(name)
177
- end
128
+ def embed_many(name, options = {}, &block)
129
+ add_association(
130
+ Associations::EmbedMany,
131
+ Associations::Options.new(
132
+ options.merge(:name => name, :extend => block)
133
+ )
134
+ )
178
135
  end
179
136
 
180
- alias :embed_one :embeds_one
181
- alias :has_one :embeds_one
182
-
183
137
  # Adds a relational association from the Document to many Documents in
184
138
  # another database or collection.
185
139
  #
@@ -195,12 +149,51 @@ module Mongoid # :nodoc:
195
149
  # end
196
150
  #
197
151
  def has_many_related(name, options = {}, &block)
198
- associate(Associations::HasManyRelated, optionize(name, options, fk(self.name, options), &block))
152
+ add_association(Associations::HasManyRelated,
153
+ Associations::Options.new(
154
+ options.merge(:name => name, :foreign_key => foreign_key(self.name, options), :extend => block)
155
+ )
156
+ )
199
157
  before_save do |document|
200
158
  document.update_associations(name)
201
159
  end
202
160
  end
203
161
 
162
+ # Deprecated: Document.has_one will become Document.embed_one
163
+ def has_one(name, options = {}, &block)
164
+ Mongoid.deprecate("Document.has_one will become Document.embed_one")
165
+ embed_one(name, options, &block)
166
+ end
167
+
168
+ # Adds the association from a parent document to its child. The name
169
+ # of the association needs to be a singular form of the child class
170
+ # name.
171
+ #
172
+ # Options:
173
+ #
174
+ # name: A +Symbol+ that is the plural child class name.
175
+ #
176
+ # Example:
177
+ #
178
+ # class Person
179
+ # include Mongoid::Document
180
+ # embed_one :name
181
+ # end
182
+ #
183
+ # class Name
184
+ # include Mongoid::Document
185
+ # embedded_in :person
186
+ # end
187
+ def embed_one(name, options = {}, &block)
188
+ opts = Associations::Options.new(
189
+ options.merge(:name => name, :extend => block)
190
+ )
191
+ type = Associations::EmbedOne
192
+ add_association(type, opts)
193
+ add_builder(type, opts)
194
+ add_creator(type, opts)
195
+ end
196
+
204
197
  # Adds a relational association from the Document to one Document in
205
198
  # another database or collection.
206
199
  #
@@ -215,7 +208,12 @@ module Mongoid # :nodoc:
215
208
  # has_one_related :game
216
209
  # end
217
210
  def has_one_related(name, options = {}, &block)
218
- associate(Associations::HasOneRelated, optionize(name, options, fk(self.name, options), &block))
211
+ add_association(
212
+ Associations::HasOneRelated,
213
+ Associations::Options.new(
214
+ options.merge(:name => name, :foreign_key => foreign_key(name, options), :extend => block)
215
+ )
216
+ )
219
217
  before_save do |document|
220
218
  document.update_association(name)
221
219
  end
@@ -240,17 +238,14 @@ module Mongoid # :nodoc:
240
238
  # Adds the association to the associations hash with the type as the key,
241
239
  # then adds the accessors for the association. The defined setters and
242
240
  # getters for the associations will perform the necessary memoization.
243
- #
244
- # Example:
245
- #
246
- # <tt>Person.associate(EmbedsMany, { :name => :addresses })</tt>
247
- def associate(type, options)
241
+ def add_association(type, options)
248
242
  name = options.name.to_s
249
243
  associations[name] = MetaData.new(type, options)
250
- define_method(name) { memoized(name) { type.instantiate(self, options) } }
244
+ define_method(name) do
245
+ memoized(name) { type.instantiate(self, options) }
246
+ end
251
247
  define_method("#{name}=") do |object|
252
- unmemoize(name)
253
- memoized(name) { type.update(object, self, options) }
248
+ reset(name) { type.update(object, self, options) }
254
249
  end
255
250
  end
256
251
 
@@ -269,32 +264,14 @@ module Mongoid # :nodoc:
269
264
  name = options.name.to_s
270
265
  define_method("create_#{name}") do |attrs|
271
266
  document = send("build_#{name}", attrs)
272
- document.save; document
267
+ document.run_callbacks(:create) { document.save }; document
273
268
  end
274
269
  end
275
270
 
276
- # build the options given the params.
277
- def optionize(name, options, foreign_key, &block)
278
- Associations::Options.new(
279
- options.merge(:name => name, :foreign_key => foreign_key, :extend => block)
280
- )
281
- end
282
-
283
271
  # Find the foreign key.
284
- def fk(name, options)
272
+ def foreign_key(name, options)
285
273
  options[:foreign_key] || name.to_s.foreign_key
286
274
  end
287
-
288
- # Build the association options.
289
- def build_options(name, options, &block)
290
- Associations::Options.new(
291
- options.merge(
292
- :name => name,
293
- :foreign_key => foreign_key(name, options),
294
- :extend => block
295
- )
296
- )
297
- end
298
275
  end
299
276
  end
300
277
  end