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.
Files changed (276) hide show
  1. data/CHANGELOG.md +615 -0
  2. data/LICENSE +20 -0
  3. data/README.md +62 -0
  4. data/Rakefile +49 -0
  5. data/lib/config/locales/bg.yml +54 -0
  6. data/lib/config/locales/de.yml +54 -0
  7. data/lib/config/locales/en-GB.yml +55 -0
  8. data/lib/config/locales/en.yml +55 -0
  9. data/lib/config/locales/es.yml +52 -0
  10. data/lib/config/locales/fr.yml +55 -0
  11. data/lib/config/locales/hi.yml +46 -0
  12. data/lib/config/locales/hu.yml +57 -0
  13. data/lib/config/locales/id.yml +55 -0
  14. data/lib/config/locales/it.yml +52 -0
  15. data/lib/config/locales/ja.yml +50 -0
  16. data/lib/config/locales/kr.yml +47 -0
  17. data/lib/config/locales/nl.yml +52 -0
  18. data/lib/config/locales/pl.yml +52 -0
  19. data/lib/config/locales/pt-BR.yml +53 -0
  20. data/lib/config/locales/pt.yml +53 -0
  21. data/lib/config/locales/ro.yml +59 -0
  22. data/lib/config/locales/ru.yml +54 -0
  23. data/lib/config/locales/sv.yml +53 -0
  24. data/lib/config/locales/vi.yml +55 -0
  25. data/lib/config/locales/zh-CN.yml +46 -0
  26. data/lib/mongoid.rb +148 -0
  27. data/lib/mongoid/atomic.rb +230 -0
  28. data/lib/mongoid/atomic/modifiers.rb +243 -0
  29. data/lib/mongoid/atomic/paths.rb +3 -0
  30. data/lib/mongoid/atomic/paths/embedded.rb +43 -0
  31. data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
  32. data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
  33. data/lib/mongoid/atomic/paths/root.rb +40 -0
  34. data/lib/mongoid/attributes.rb +234 -0
  35. data/lib/mongoid/attributes/processing.rb +146 -0
  36. data/lib/mongoid/callbacks.rb +135 -0
  37. data/lib/mongoid/collection.rb +153 -0
  38. data/lib/mongoid/collection_proxy.rb +59 -0
  39. data/lib/mongoid/collections.rb +120 -0
  40. data/lib/mongoid/collections/master.rb +45 -0
  41. data/lib/mongoid/collections/operations.rb +44 -0
  42. data/lib/mongoid/collections/retry.rb +46 -0
  43. data/lib/mongoid/components.rb +96 -0
  44. data/lib/mongoid/config.rb +347 -0
  45. data/lib/mongoid/config/database.rb +186 -0
  46. data/lib/mongoid/config/replset_database.rb +82 -0
  47. data/lib/mongoid/connection_proxy.rb +30 -0
  48. data/lib/mongoid/contexts.rb +25 -0
  49. data/lib/mongoid/contexts/enumerable.rb +288 -0
  50. data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
  51. data/lib/mongoid/contexts/mongo.rb +409 -0
  52. data/lib/mongoid/copyable.rb +48 -0
  53. data/lib/mongoid/criteria.rb +418 -0
  54. data/lib/mongoid/criterion/builder.rb +34 -0
  55. data/lib/mongoid/criterion/complex.rb +84 -0
  56. data/lib/mongoid/criterion/creational.rb +34 -0
  57. data/lib/mongoid/criterion/exclusion.rb +108 -0
  58. data/lib/mongoid/criterion/inclusion.rb +305 -0
  59. data/lib/mongoid/criterion/inspection.rb +22 -0
  60. data/lib/mongoid/criterion/optional.rb +232 -0
  61. data/lib/mongoid/criterion/selector.rb +153 -0
  62. data/lib/mongoid/cursor.rb +86 -0
  63. data/lib/mongoid/database_proxy.rb +97 -0
  64. data/lib/mongoid/default_scope.rb +36 -0
  65. data/lib/mongoid/dirty.rb +110 -0
  66. data/lib/mongoid/document.rb +280 -0
  67. data/lib/mongoid/errors.rb +17 -0
  68. data/lib/mongoid/errors/callback.rb +26 -0
  69. data/lib/mongoid/errors/document_not_found.rb +28 -0
  70. data/lib/mongoid/errors/eager_load.rb +25 -0
  71. data/lib/mongoid/errors/invalid_collection.rb +18 -0
  72. data/lib/mongoid/errors/invalid_database.rb +19 -0
  73. data/lib/mongoid/errors/invalid_field.rb +18 -0
  74. data/lib/mongoid/errors/invalid_find.rb +19 -0
  75. data/lib/mongoid/errors/invalid_options.rb +28 -0
  76. data/lib/mongoid/errors/invalid_time.rb +25 -0
  77. data/lib/mongoid/errors/invalid_type.rb +25 -0
  78. data/lib/mongoid/errors/mixed_relations.rb +37 -0
  79. data/lib/mongoid/errors/mongoid_error.rb +26 -0
  80. data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
  81. data/lib/mongoid/errors/unsaved_document.rb +23 -0
  82. data/lib/mongoid/errors/unsupported_version.rb +20 -0
  83. data/lib/mongoid/errors/validations.rb +23 -0
  84. data/lib/mongoid/extensions.rb +82 -0
  85. data/lib/mongoid/extensions/array/deletion.rb +29 -0
  86. data/lib/mongoid/extensions/false_class/equality.rb +26 -0
  87. data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
  88. data/lib/mongoid/extensions/hash/scoping.rb +25 -0
  89. data/lib/mongoid/extensions/integer/checks.rb +23 -0
  90. data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
  91. data/lib/mongoid/extensions/object/checks.rb +29 -0
  92. data/lib/mongoid/extensions/object/reflections.rb +48 -0
  93. data/lib/mongoid/extensions/object/substitutable.rb +15 -0
  94. data/lib/mongoid/extensions/object/yoda.rb +44 -0
  95. data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
  96. data/lib/mongoid/extensions/proc/scoping.rb +25 -0
  97. data/lib/mongoid/extensions/string/checks.rb +36 -0
  98. data/lib/mongoid/extensions/string/conversions.rb +22 -0
  99. data/lib/mongoid/extensions/string/inflections.rb +118 -0
  100. data/lib/mongoid/extensions/symbol/checks.rb +23 -0
  101. data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
  102. data/lib/mongoid/extensions/true_class/equality.rb +26 -0
  103. data/lib/mongoid/extras.rb +31 -0
  104. data/lib/mongoid/factory.rb +46 -0
  105. data/lib/mongoid/fields.rb +332 -0
  106. data/lib/mongoid/fields/mappings.rb +41 -0
  107. data/lib/mongoid/fields/serializable.rb +201 -0
  108. data/lib/mongoid/fields/serializable/array.rb +49 -0
  109. data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
  110. data/lib/mongoid/fields/serializable/bignum.rb +10 -0
  111. data/lib/mongoid/fields/serializable/binary.rb +11 -0
  112. data/lib/mongoid/fields/serializable/boolean.rb +43 -0
  113. data/lib/mongoid/fields/serializable/date.rb +51 -0
  114. data/lib/mongoid/fields/serializable/date_time.rb +28 -0
  115. data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
  116. data/lib/mongoid/fields/serializable/float.rb +32 -0
  117. data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
  118. data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
  119. data/lib/mongoid/fields/serializable/hash.rb +11 -0
  120. data/lib/mongoid/fields/serializable/integer.rb +44 -0
  121. data/lib/mongoid/fields/serializable/localized.rb +41 -0
  122. data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
  123. data/lib/mongoid/fields/serializable/object.rb +11 -0
  124. data/lib/mongoid/fields/serializable/object_id.rb +31 -0
  125. data/lib/mongoid/fields/serializable/range.rb +42 -0
  126. data/lib/mongoid/fields/serializable/set.rb +42 -0
  127. data/lib/mongoid/fields/serializable/string.rb +27 -0
  128. data/lib/mongoid/fields/serializable/symbol.rb +27 -0
  129. data/lib/mongoid/fields/serializable/time.rb +23 -0
  130. data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
  131. data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
  132. data/lib/mongoid/finders.rb +152 -0
  133. data/lib/mongoid/hierarchy.rb +120 -0
  134. data/lib/mongoid/identity.rb +92 -0
  135. data/lib/mongoid/identity_map.rb +119 -0
  136. data/lib/mongoid/indexes.rb +54 -0
  137. data/lib/mongoid/inspection.rb +54 -0
  138. data/lib/mongoid/javascript.rb +20 -0
  139. data/lib/mongoid/javascript/functions.yml +63 -0
  140. data/lib/mongoid/json.rb +16 -0
  141. data/lib/mongoid/keys.rb +144 -0
  142. data/lib/mongoid/logger.rb +39 -0
  143. data/lib/mongoid/matchers.rb +32 -0
  144. data/lib/mongoid/matchers/all.rb +21 -0
  145. data/lib/mongoid/matchers/and.rb +30 -0
  146. data/lib/mongoid/matchers/default.rb +70 -0
  147. data/lib/mongoid/matchers/exists.rb +23 -0
  148. data/lib/mongoid/matchers/gt.rb +21 -0
  149. data/lib/mongoid/matchers/gte.rb +21 -0
  150. data/lib/mongoid/matchers/in.rb +21 -0
  151. data/lib/mongoid/matchers/lt.rb +21 -0
  152. data/lib/mongoid/matchers/lte.rb +21 -0
  153. data/lib/mongoid/matchers/ne.rb +21 -0
  154. data/lib/mongoid/matchers/nin.rb +21 -0
  155. data/lib/mongoid/matchers/or.rb +33 -0
  156. data/lib/mongoid/matchers/size.rb +21 -0
  157. data/lib/mongoid/matchers/strategies.rb +93 -0
  158. data/lib/mongoid/multi_database.rb +31 -0
  159. data/lib/mongoid/multi_parameter_attributes.rb +106 -0
  160. data/lib/mongoid/named_scope.rb +146 -0
  161. data/lib/mongoid/nested_attributes.rb +54 -0
  162. data/lib/mongoid/observer.rb +170 -0
  163. data/lib/mongoid/paranoia.rb +158 -0
  164. data/lib/mongoid/persistence.rb +264 -0
  165. data/lib/mongoid/persistence/atomic.rb +223 -0
  166. data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
  167. data/lib/mongoid/persistence/atomic/bit.rb +37 -0
  168. data/lib/mongoid/persistence/atomic/inc.rb +31 -0
  169. data/lib/mongoid/persistence/atomic/operation.rb +85 -0
  170. data/lib/mongoid/persistence/atomic/pop.rb +34 -0
  171. data/lib/mongoid/persistence/atomic/pull.rb +34 -0
  172. data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
  173. data/lib/mongoid/persistence/atomic/push.rb +31 -0
  174. data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
  175. data/lib/mongoid/persistence/atomic/rename.rb +31 -0
  176. data/lib/mongoid/persistence/atomic/sets.rb +30 -0
  177. data/lib/mongoid/persistence/atomic/unset.rb +28 -0
  178. data/lib/mongoid/persistence/deletion.rb +32 -0
  179. data/lib/mongoid/persistence/insertion.rb +41 -0
  180. data/lib/mongoid/persistence/modification.rb +37 -0
  181. data/lib/mongoid/persistence/operations.rb +211 -0
  182. data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
  183. data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
  184. data/lib/mongoid/persistence/operations/insert.rb +34 -0
  185. data/lib/mongoid/persistence/operations/remove.rb +33 -0
  186. data/lib/mongoid/persistence/operations/update.rb +64 -0
  187. data/lib/mongoid/railtie.rb +126 -0
  188. data/lib/mongoid/railties/database.rake +182 -0
  189. data/lib/mongoid/railties/document.rb +12 -0
  190. data/lib/mongoid/relations.rb +144 -0
  191. data/lib/mongoid/relations/accessors.rb +138 -0
  192. data/lib/mongoid/relations/auto_save.rb +38 -0
  193. data/lib/mongoid/relations/binding.rb +26 -0
  194. data/lib/mongoid/relations/bindings.rb +9 -0
  195. data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
  196. data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
  197. data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
  198. data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
  199. data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
  200. data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
  201. data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
  202. data/lib/mongoid/relations/builder.rb +57 -0
  203. data/lib/mongoid/relations/builders.rb +83 -0
  204. data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
  205. data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
  206. data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
  207. data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
  208. data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
  209. data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
  210. data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
  211. data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
  212. data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
  213. data/lib/mongoid/relations/cascading.rb +56 -0
  214. data/lib/mongoid/relations/cascading/delete.rb +19 -0
  215. data/lib/mongoid/relations/cascading/destroy.rb +26 -0
  216. data/lib/mongoid/relations/cascading/nullify.rb +18 -0
  217. data/lib/mongoid/relations/cascading/strategy.rb +26 -0
  218. data/lib/mongoid/relations/constraint.rb +42 -0
  219. data/lib/mongoid/relations/conversions.rb +35 -0
  220. data/lib/mongoid/relations/cyclic.rb +103 -0
  221. data/lib/mongoid/relations/embedded/atomic.rb +89 -0
  222. data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
  223. data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
  224. data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
  225. data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
  226. data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
  227. data/lib/mongoid/relations/embedded/in.rb +220 -0
  228. data/lib/mongoid/relations/embedded/many.rb +560 -0
  229. data/lib/mongoid/relations/embedded/one.rb +206 -0
  230. data/lib/mongoid/relations/embedded/sort.rb +31 -0
  231. data/lib/mongoid/relations/macros.rb +310 -0
  232. data/lib/mongoid/relations/many.rb +135 -0
  233. data/lib/mongoid/relations/metadata.rb +919 -0
  234. data/lib/mongoid/relations/nested_builder.rb +75 -0
  235. data/lib/mongoid/relations/one.rb +36 -0
  236. data/lib/mongoid/relations/options.rb +47 -0
  237. data/lib/mongoid/relations/polymorphic.rb +40 -0
  238. data/lib/mongoid/relations/proxy.rb +145 -0
  239. data/lib/mongoid/relations/referenced/batch.rb +72 -0
  240. data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
  241. data/lib/mongoid/relations/referenced/in.rb +262 -0
  242. data/lib/mongoid/relations/referenced/many.rb +623 -0
  243. data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
  244. data/lib/mongoid/relations/referenced/one.rb +272 -0
  245. data/lib/mongoid/relations/reflections.rb +62 -0
  246. data/lib/mongoid/relations/synchronization.rb +153 -0
  247. data/lib/mongoid/relations/targets.rb +2 -0
  248. data/lib/mongoid/relations/targets/enumerable.rb +372 -0
  249. data/lib/mongoid/reloading.rb +91 -0
  250. data/lib/mongoid/safety.rb +105 -0
  251. data/lib/mongoid/scope.rb +31 -0
  252. data/lib/mongoid/serialization.rb +134 -0
  253. data/lib/mongoid/sharding.rb +61 -0
  254. data/lib/mongoid/state.rb +97 -0
  255. data/lib/mongoid/threaded.rb +530 -0
  256. data/lib/mongoid/threaded/lifecycle.rb +192 -0
  257. data/lib/mongoid/timestamps.rb +15 -0
  258. data/lib/mongoid/timestamps/created.rb +24 -0
  259. data/lib/mongoid/timestamps/timeless.rb +50 -0
  260. data/lib/mongoid/timestamps/updated.rb +26 -0
  261. data/lib/mongoid/validations.rb +140 -0
  262. data/lib/mongoid/validations/associated.rb +46 -0
  263. data/lib/mongoid/validations/uniqueness.rb +145 -0
  264. data/lib/mongoid/version.rb +4 -0
  265. data/lib/mongoid/versioning.rb +185 -0
  266. data/lib/rack/mongoid.rb +2 -0
  267. data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
  268. data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
  269. data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
  270. data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
  271. data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
  272. data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
  273. data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
  274. data/lib/rails/generators/mongoid_generator.rb +70 -0
  275. data/lib/rails/mongoid.rb +91 -0
  276. metadata +465 -0
@@ -0,0 +1,138 @@
1
+ # encoding: utf-8
2
+ module Mongoid # :nodoc:
3
+ module Relations #:nodoc:
4
+
5
+ # This module contains all the behaviour related to accessing relations
6
+ # through the getters and setters, and how to delegate to builders to
7
+ # create new ones.
8
+ module Accessors
9
+ extend ActiveSupport::Concern
10
+
11
+ # Builds the related document and creates the relation unless the
12
+ # document is nil, then sets the relation on this document.
13
+ #
14
+ # @example Build the relation.
15
+ # person.build(:addresses, { :id => 1 }, metadata)
16
+ #
17
+ # @param [ String, Symbol ] name The name of the relation.
18
+ # @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
19
+ # @param [ Metadata ] metadata The relation's metadata.
20
+ # @param [ true, false ] building If we are in a build operation.
21
+ #
22
+ # @return [ Proxy ] The relation.
23
+ #
24
+ # @since 2.0.0.rc.1
25
+ def build(name, object, metadata)
26
+ relation = create_relation(object, metadata)
27
+ set_relation(name, relation)
28
+ end
29
+
30
+ # Create a relation from an object and metadata.
31
+ #
32
+ # @example Create the relation.
33
+ # person.create_relation(document, metadata)
34
+ #
35
+ # @param [ Document, Array<Document ] object The relation target.
36
+ # @param [ Metadata ] metadata The relation metadata.
37
+ #
38
+ # @return [ Proxy ] The relation.
39
+ #
40
+ # @since 2.0.0.rc.1
41
+ def create_relation(object, metadata)
42
+ type = @attributes[metadata.inverse_type]
43
+ target = metadata.builder(self, object).build(type)
44
+ target ? metadata.relation.new(self, target, metadata) : nil
45
+ end
46
+
47
+ # Determines if the relation exists or not.
48
+ #
49
+ # @example Does the relation exist?
50
+ # person.relation_exists?(:people)
51
+ #
52
+ # @param [ String ] name The name of the relation to check.
53
+ #
54
+ # @return [ true, false ] True if set and not nil, false if not.
55
+ #
56
+ # @since 2.0.0.rc.1
57
+ def relation_exists?(name)
58
+ ivar(name)
59
+ end
60
+
61
+ # Set the supplied relation to an instance variable on the class with the
62
+ # provided name. Used as a helper just for code cleanliness.
63
+ #
64
+ # @example Set the proxy on the document.
65
+ # person.set(:addresses, addresses)
66
+ #
67
+ # @param [ String, Symbol ] name The name of the relation.
68
+ # @param [ Proxy ] relation The relation to set.
69
+ #
70
+ # @return [ Proxy ] The relation.
71
+ #
72
+ # @since 2.0.0.rc.1
73
+ def set_relation(name, relation)
74
+ instance_variable_set("@#{name}", relation)
75
+ end
76
+
77
+ module ClassMethods #:nodoc:
78
+
79
+ # Defines the getter for the relation. Nothing too special here: just
80
+ # return the instance variable for the relation if it exists or build
81
+ # the thing.
82
+ #
83
+ # @example Set up the getter for the relation.
84
+ # Person.getter("addresses", metadata)
85
+ #
86
+ # @param [ String, Symbol ] name The name of the relation.
87
+ # @param [ Metadata ] metadata The metadata for the relation.
88
+ #
89
+ # @return [ Class ] The class being set up.
90
+ #
91
+ # @since 2.0.0.rc.1
92
+ def getter(name, metadata)
93
+ tap do
94
+ define_method(name) do |*args|
95
+ reload, variable = args.first, "@#{name}"
96
+ if instance_variable_defined?(variable) && !reload
97
+ instance_variable_get(variable)
98
+ else
99
+ _building do
100
+ _loading do
101
+ build(name, attributes[metadata.key], metadata)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ # Defines the setter for the relation. This does a few things based on
110
+ # some conditions. If there is an existing association, a target
111
+ # substitution will take place, otherwise a new relation will be
112
+ # created with the supplied target.
113
+ #
114
+ # @example Set up the setter for the relation.
115
+ # Person.setter("addresses", metadata)
116
+ #
117
+ # @param [ String, Symbol ] name The name of the relation.
118
+ # @param [ Metadata ] metadata The metadata for the relation.
119
+ #
120
+ # @return [ Class ] The class being set up.
121
+ #
122
+ # @since 2.0.0.rc.1
123
+ def setter(name, metadata)
124
+ tap do
125
+ define_method("#{name}=") do |object|
126
+ if relation_exists?(name) || metadata.many? ||
127
+ (object.blank? && send(name))
128
+ set_relation(name, send(name).substitute(object.substitutable))
129
+ else
130
+ build(name, object.substitutable, metadata)
131
+ end
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,38 @@
1
+ # encoding: utf-8
2
+ module Mongoid # :nodoc:
3
+ module Relations #:nodoc:
4
+
5
+ # This module contains the behaviour for auto-saving relations in
6
+ # different collections.
7
+ module AutoSave
8
+ extend ActiveSupport::Concern
9
+
10
+ module ClassMethods #:nodoc:
11
+
12
+ # Set up the autosave behaviour for references many and references one
13
+ # relations. When the option is set to true, these relations will get
14
+ # saved automatically when the parent is first saved, but not if the
15
+ # parent already exists in the database.
16
+ #
17
+ # @example Set up autosave options.
18
+ # Person.autosave(metadata)
19
+ #
20
+ # @param [ Metadata ] metadata The relation metadata.
21
+ #
22
+ # @since 2.0.0.rc.1
23
+ def autosave(metadata)
24
+ if metadata.autosave?
25
+ set_callback :save, :after do |document|
26
+ relation = document.send(metadata.name)
27
+ if relation
28
+ (relation.do_or_do_not(:in_memory) || relation.to_a).each do |doc|
29
+ doc.save
30
+ end
31
+ end
32
+ end
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
+
5
+ # Superclass for all objects that bind relations together.
6
+ class Binding
7
+ include Threaded::Lifecycle
8
+
9
+ attr_reader :base, :target, :metadata
10
+
11
+ # Create the new binding.
12
+ #
13
+ # @example Initialize a binding.
14
+ # Binding.new(base, target, metadata)
15
+ #
16
+ # @param [ Document ] base The base of the binding.
17
+ # @param [ Document, Array<Document> ] target The target of the binding.
18
+ # @param [ Metadata ] metadata The relation's metadata.
19
+ #
20
+ # @since 2.0.0.rc.1
21
+ def initialize(base, target, metadata)
22
+ @base, @target, @metadata = base, target, metadata
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ # encoding: utf-8
2
+ require "mongoid/relations/binding"
3
+ require "mongoid/relations/bindings/embedded/in"
4
+ require "mongoid/relations/bindings/embedded/many"
5
+ require "mongoid/relations/bindings/embedded/one"
6
+ require "mongoid/relations/bindings/referenced/in"
7
+ require "mongoid/relations/bindings/referenced/many"
8
+ require "mongoid/relations/bindings/referenced/many_to_many"
9
+ require "mongoid/relations/bindings/referenced/one"
@@ -0,0 +1,69 @@
1
+ # encoding: utf-8
2
+ module Mongoid # :nodoc:
3
+ module Relations #:nodoc:
4
+ module Bindings #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Binding class for embedded_in relations.
8
+ class In < Binding
9
+
10
+ # Binds the base object to the inverse of the relation. This is so we
11
+ # are referenced to the actual objects themselves on both sides.
12
+ #
13
+ # This case sets the metadata on the inverse object as well as the
14
+ # document itself.
15
+ #
16
+ # @example Bind the documents.
17
+ # name.person.bind(:continue => true)
18
+ # name.person = Person.new
19
+ #
20
+ # @param [ Hash ] options The binding options.
21
+ #
22
+ # @option options [ true, false ] :continue Continue binding the inverse.
23
+ # @option options [ true, false ] :binding Are we in build mode?
24
+ #
25
+ # @since 2.0.0.rc.1
26
+ def bind
27
+ base.metadata = metadata.inverse_metadata(target) unless base.metadata
28
+ base.parentize(target)
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
36
+ end
37
+ end
38
+ end
39
+ alias :bind_one :bind
40
+
41
+ # Unbinds the base object and the inverse, caused by setting the
42
+ # reference to nil.
43
+ #
44
+ # @example Unbind the document.
45
+ # name.person.unbind(:continue => true)
46
+ # name.person = nil
47
+ #
48
+ # @param [ Hash ] options The options to pass through.
49
+ #
50
+ # @option options [ true, false ] :continue Do we continue unbinding?
51
+ #
52
+ # @since 2.0.0.rc.1
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
61
+ end
62
+ end
63
+ end
64
+ alias :unbind_one :unbind
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,93 @@
1
+ # encoding: utf-8
2
+ module Mongoid # :nodoc:
3
+ module Relations #:nodoc:
4
+ module Bindings #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Binding class for embeds_many relations.
8
+ class Many < Binding
9
+
10
+ # Binds the base object to the inverse of the relation. This is so we
11
+ # are referenced to the actual objects themselves on both sides.
12
+ #
13
+ # This case sets the metadata on the inverse object as well as the
14
+ # document itself.
15
+ #
16
+ # @example Bind all the documents.
17
+ # person.addresses.bind
18
+ # person.addresses = [ Address.new ]
19
+ #
20
+ # @param [ Hash ] options The binding options.
21
+ #
22
+ # @option options [ true, false ] :continue Continue binding the inverse.
23
+ # @option options [ true, false ] :binding Are we in build mode?
24
+ #
25
+ # @since 2.0.0.rc.1
26
+ def bind
27
+ target.each { |doc| bind_one(doc) }
28
+ end
29
+
30
+ # Binds a single document with the inverse relation. Used
31
+ # specifically when appending to the proxy.
32
+ #
33
+ # @example Bind one document.
34
+ # person.addresses.bind_one(address)
35
+ #
36
+ # @param [ Document ] doc The single document to bind.
37
+ # @param [ Hash ] options The binding options.
38
+ #
39
+ # @option options [ true, false ] :continue Continue binding the inverse.
40
+ # @option options [ true, false ] :binding Are we in build mode?
41
+ #
42
+ # @since 2.0.0.rc.1
43
+ def bind_one(doc)
44
+ doc.parentize(base)
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
51
+ end
52
+ end
53
+
54
+ # Unbinds the base object and the inverse, caused by setting the
55
+ # reference to nil.
56
+ #
57
+ # @example Unbind the documents.
58
+ # person.addresses.unbind
59
+ # person.addresses = nil
60
+ #
61
+ # @param [ Hash ] options The binding options.
62
+ #
63
+ # @option options [ true, false ] :continue Continue binding the inverse.
64
+ # @option options [ true, false ] :binding Are we in build mode?
65
+ #
66
+ # @since 2.0.0.rc.1
67
+ def unbind
68
+ target.each { |doc| unbind_one(doc) }
69
+ end
70
+
71
+ # Unbind a single document.
72
+ #
73
+ # @example Unbind the document.
74
+ # person.addresses.unbind_one(document)
75
+ #
76
+ # @param [ Hash ] options The binding options.
77
+ #
78
+ # @option options [ true, false ] :continue Continue binding the inverse.
79
+ # @option options [ true, false ] :binding Are we in build mode?
80
+ #
81
+ # @since 2.0.0.rc.1
82
+ def unbind_one(doc)
83
+ unless _binding?
84
+ _binding do
85
+ doc.do_or_do_not(metadata.inverse_setter(target), nil)
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ module Mongoid # :nodoc:
3
+ module Relations #:nodoc:
4
+ module Bindings #:nodoc:
5
+ module Embedded #:nodoc:
6
+
7
+ # Binding class for embeds_one relations.
8
+ class One < Binding
9
+
10
+ # Binds the base object to the inverse of the relation. This is so we
11
+ # are referenced to the actual objects themselves on both sides.
12
+ #
13
+ # This case sets the metadata on the inverse object as well as the
14
+ # document itself.
15
+ #
16
+ # @example Bind the document.
17
+ # person.name.bind(:continue => true)
18
+ # person.name = Name.new
19
+ #
20
+ # @param [ Hash ] options The options to pass through.
21
+ #
22
+ # @option options [ true, false ] :continue Do we continue binding?
23
+ # @option options [ true, false ] :binding Are we in build mode?
24
+ #
25
+ # @since 2.0.0.rc.1
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
32
+ end
33
+ end
34
+ alias :bind_one :bind
35
+
36
+ # Unbinds the base object and the inverse, caused by setting the
37
+ # reference to nil.
38
+ #
39
+ # @example Unbind the document.
40
+ # person.name.unbind(:continue => true)
41
+ # person.name = nil
42
+ #
43
+ # @param [ Hash ] options The options to pass through.
44
+ #
45
+ # @option options [ true, false ] :continue Do we continue unbinding?
46
+ # @option options [ true, false ] :binding Are we in build mode?
47
+ #
48
+ # @since 2.0.0.rc.1
49
+ def unbind
50
+ unless _binding?
51
+ _binding do
52
+ target.do_or_do_not(metadata.inverse_setter(target), nil)
53
+ end
54
+ end
55
+ end
56
+ alias :unbind_one :unbind
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,76 @@
1
+ # encoding: utf-8
2
+ module Mongoid # :nodoc:
3
+ module Relations #:nodoc:
4
+ module Bindings #:nodoc:
5
+ module Referenced #:nodoc:
6
+
7
+ # Binding class for all referenced_in relations.
8
+ class In < Binding
9
+
10
+ # Binds the base object to the inverse of the relation. This is so we
11
+ # are referenced to the actual objects themselves on both sides.
12
+ #
13
+ # This case sets the metadata on the inverse object as well as the
14
+ # document itself.
15
+ #
16
+ # @example Bind the documents.
17
+ # game.person.bind(:continue => true)
18
+ # game.person = Person.new
19
+ #
20
+ # @since 2.0.0.rc.1
21
+ def bind
22
+ unless _binding?
23
+ _binding do
24
+ inverse = metadata.inverse(target)
25
+ base.you_must(metadata.foreign_key_setter, target.id)
26
+ if metadata.inverse_type
27
+ base.you_must(metadata.inverse_type_setter, target.class.model_name)
28
+ end
29
+ if inverse
30
+ inverse_metadata = metadata.inverse_metadata(target)
31
+ if inverse_metadata != metadata && !inverse_metadata.nil?
32
+ base.metadata = inverse_metadata
33
+ if base.referenced_many?
34
+ target.send(inverse).push(base) unless Mongoid.identity_map_enabled?
35
+ else
36
+ target.do_or_do_not(metadata.inverse_setter(target), base)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ alias :bind_one :bind
44
+
45
+ # Unbinds the base object and the inverse, caused by setting the
46
+ # reference to nil.
47
+ #
48
+ # @example Unbind the document.
49
+ # game.person.unbind(:continue => true)
50
+ # game.person = nil
51
+ #
52
+ # @since 2.0.0.rc.1
53
+ def unbind
54
+ unless _binding?
55
+ _binding do
56
+ inverse = metadata.inverse(target)
57
+ base.you_must(metadata.foreign_key_setter, nil)
58
+ if metadata.inverse_type
59
+ base.you_must(metadata.inverse_type_setter, nil)
60
+ end
61
+ if inverse
62
+ if base.referenced_many?
63
+ target.send(inverse).delete(base)
64
+ else
65
+ target.send(metadata.inverse_setter(target), nil)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ alias :unbind_one :unbind
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end