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,64 @@
1
+ # encoding: utf-8
2
+ module Mongoid #:nodoc:
3
+ module Persistence #:nodoc:
4
+ module Operations #:nodoc:
5
+
6
+ # Update is a persistence command responsible for taking a document that
7
+ # has already been saved to the database and saving it, depending on
8
+ # whether or not the document has been modified.
9
+ #
10
+ # Before persisting the command will check via dirty attributes if the
11
+ # document has changed, if not, it will simply return true. If it has it
12
+ # will go through the validation steps, run callbacks, and set the changed
13
+ # fields atomically on the document. The underlying query resembles the
14
+ # following MongoDB query:
15
+ #
16
+ # collection.update(
17
+ # { "_id" : 1,
18
+ # { "$set" : { "field" : "value" },
19
+ # false,
20
+ # false
21
+ # );
22
+ #
23
+ # For embedded documents it will use the positional locator:
24
+ #
25
+ # collection.update(
26
+ # { "_id" : 1, "addresses._id" : 2 },
27
+ # { "$set" : { "addresses.$.field" : "value" },
28
+ # false,
29
+ # false
30
+ # );
31
+ #
32
+ class Update
33
+ include Modification, Operations
34
+
35
+ # Persist the document that is to be updated to the database. This will
36
+ # only write changed fields via MongoDB's $set modifier operation.
37
+ #
38
+ # @example Update the document.
39
+ # Update.persist
40
+ #
41
+ # @return [ true, false ] If the save passed.
42
+ def persist
43
+ prepare do
44
+ unless updates.empty?
45
+ # @todo Durran: This is a temporary fix for #791 until we rewrite
46
+ # the dirty tracking to properly flag a document as changed if
47
+ # only embedded documents have changed.
48
+ if document.respond_to?(:updated_at)
49
+ if document.timestamping? && !document.updated_at_changed?
50
+ document.updated_at = Time.now
51
+ end
52
+ end
53
+
54
+ collection.update(selector, updates, options)
55
+ conflicts.each_pair do |key, value|
56
+ collection.update(selector, { key => value }, options)
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,126 @@
1
+ # encoding: utf-8
2
+ require "singleton"
3
+ require "mongoid"
4
+ require "mongoid/config"
5
+ require "mongoid/railties/document"
6
+ require "rails"
7
+ require "rails/mongoid"
8
+
9
+ module Rails #:nodoc:
10
+ module Mongoid #:nodoc:
11
+ class Railtie < Rails::Railtie #:nodoc:
12
+
13
+ # Determine which generator to use. app_generators was introduced after
14
+ # 3.0.0.
15
+ #
16
+ # @example Get the generators method.
17
+ # railtie.generators
18
+ #
19
+ # @return [ Symbol ] The method name to use.
20
+ #
21
+ # @since 2.0.0.rc.4
22
+ def self.generator
23
+ config.respond_to?(:app_generators) ? :app_generators : :generators
24
+ end
25
+
26
+ config.send(generator).orm :mongoid, :migration => false
27
+
28
+ rake_tasks do
29
+ load "mongoid/railties/database.rake"
30
+ end
31
+
32
+ # Exposes Mongoid's configuration to the Rails application configuration.
33
+ #
34
+ # @example Set up configuration in the Rails app.
35
+ # module MyApplication
36
+ # class Application < Rails::Application
37
+ # config.mongoid.logger = Logger.new($stdout, :warn)
38
+ # config.mongoid.persist_in_safe_mode = true
39
+ # end
40
+ # end
41
+ config.mongoid = ::Mongoid::Config
42
+
43
+ # Initialize Mongoid. This will look for a mongoid.yml in the config
44
+ # directory and configure mongoid appropriately.
45
+ #
46
+ # @example mongoid.yml
47
+ #
48
+ # development:
49
+ # host: localhost
50
+ # database: mongoid
51
+ # slaves:
52
+ # # - host: localhost
53
+ # # port: 27018
54
+ # # - host: localhost
55
+ # # port: 27019
56
+ # allow_dynamic_fields: false
57
+ # parameterize_keys: false
58
+ # persist_in_safe_mode: false
59
+ #
60
+ initializer "setup database" do
61
+ config_file = Rails.root.join("config", "mongoid.yml")
62
+ # @todo: Durran: Remove extra check when #1291 complete.
63
+ if config_file.file? &&
64
+ YAML.load(ERB.new(File.read(config_file)).result)[Rails.env].values.flatten.any?
65
+ ::Mongoid.load!(config_file)
66
+ end
67
+ end
68
+
69
+ # After initialization we will warn the user if we can't find a mongoid.yml and
70
+ # alert to create one.
71
+ initializer "warn when configuration is missing" do
72
+ config.after_initialize do
73
+ unless Rails.root.join("config", "mongoid.yml").file?
74
+ puts "\nMongoid config not found. Create a config file at: config/mongoid.yml"
75
+ puts "to generate one run: rails generate mongoid:config\n\n"
76
+ end
77
+ end
78
+ end
79
+
80
+ # Set the proper error types for Rails. DocumentNotFound errors should be
81
+ # 404s and not 500s, validation errors are 422s.
82
+ initializer "load http errors" do |app|
83
+ config.after_initialize do
84
+ ActionDispatch::ShowExceptions.rescue_responses.update({
85
+ "Mongoid::Errors::DocumentNotFound" => :not_found,
86
+ "Mongoid::Errors::Validations" => 422
87
+ })
88
+ end
89
+ end
90
+
91
+ # Due to all models not getting loaded and messing up inheritance queries
92
+ # and indexing, we need to preload the models in order to address this.
93
+ #
94
+ # This will happen every request in development, once in ther other
95
+ # environments.
96
+ initializer "preload all application models" do |app|
97
+ config.to_prepare do
98
+ if $rails_rake_task
99
+ # We previously got rid of this, however in the case where
100
+ # threadsafe! is enabled we must load all models so things like
101
+ # creating indexes works properly.
102
+ ::Rails::Mongoid.load_models(app)
103
+ else
104
+ ::Rails::Mongoid.preload_models(app)
105
+ end
106
+ end
107
+ end
108
+
109
+ # Need to include the Mongoid identity map middleware.
110
+ initializer "include the identity map" do |app|
111
+ app.config.middleware.use "Rack::Mongoid::Middleware::IdentityMap"
112
+ end
113
+
114
+ # Instantitate any registered observers after Rails initialization and
115
+ # instantiate them after being reloaded in the development environment
116
+ initializer "instantiate observers" do
117
+ config.after_initialize do
118
+ ::Mongoid::instantiate_observers
119
+ ActionDispatch::Reloader.to_prepare do
120
+ ::Mongoid.instantiate_observers
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,182 @@
1
+ namespace :db do
2
+
3
+ unless Rake::Task.task_defined?("db:drop")
4
+ desc 'Drops all the collections for the database for the current Rails.env'
5
+ task :drop => "mongoid:drop"
6
+ end
7
+
8
+ unless Rake::Task.task_defined?("db:seed")
9
+ # if another ORM has defined db:seed, don't run it twice.
10
+ desc 'Load the seed data from db/seeds.rb'
11
+ task :seed => :environment do
12
+ seed_file = File.join(Rails.root, 'db', 'seeds.rb')
13
+ load(seed_file) if File.exist?(seed_file)
14
+ end
15
+ end
16
+
17
+ unless Rake::Task.task_defined?("db:setup")
18
+ desc 'Create the database, and initialize with the seed data'
19
+ task :setup => [ 'db:create', 'db:mongoid:create_indexes', 'db:seed' ]
20
+ end
21
+
22
+ unless Rake::Task.task_defined?("db:reseed")
23
+ desc 'Delete data and seed'
24
+ task :reseed => [ 'db:drop', 'db:seed' ]
25
+ end
26
+
27
+ unless Rake::Task.task_defined?("db:create")
28
+ task :create => :environment do
29
+ # noop
30
+ end
31
+ end
32
+
33
+ unless Rake::Task.task_defined?("db:migrate")
34
+ task :migrate => :environment do
35
+ # noop
36
+ end
37
+ end
38
+
39
+ unless Rake::Task.task_defined?("db:schema:load")
40
+ namespace :schema do
41
+ task :load do
42
+ # noop
43
+ end
44
+ end
45
+ end
46
+
47
+ unless Rake::Task.task_defined?("db:test:prepare")
48
+ namespace :test do
49
+ task :prepare do
50
+ # noop
51
+ end
52
+ end
53
+ end
54
+
55
+ unless Rake::Task.task_defined?("db:create_indexes")
56
+ task :create_indexes => "mongoid:create_indexes"
57
+ end
58
+
59
+ namespace :mongoid do
60
+ # gets a list of the mongoid models defined in the app/models directory
61
+ def get_mongoid_models
62
+ documents = []
63
+ Dir.glob("app/models/**/*.rb").sort.each do |file|
64
+ model_path = file[0..-4].split('/')[2..-1]
65
+ begin
66
+ klass = model_path.map { |path| path.camelize }.join('::').constantize
67
+ if klass.ancestors.include?(Mongoid::Document) && !klass.embedded
68
+ documents << klass
69
+ end
70
+ rescue => e
71
+ # Just for non-mongoid objects that dont have the embedded
72
+ # attribute at the class level.
73
+ end
74
+ end
75
+ documents
76
+ end
77
+
78
+ desc 'Create the indexes defined on your mongoid models'
79
+ task :create_indexes => :environment do
80
+ engines_models_paths = Rails.application.railties.engines.map do |engine|
81
+ engine.paths["app/models"].paths
82
+ end
83
+ root_models_paths = Rails.application.paths["app/models"]
84
+ models_paths = engines_models_paths.push(root_models_paths).flatten
85
+
86
+ models_paths.each do |path|
87
+ ::Rails::Mongoid.create_indexes("#{path}/**/*.rb")
88
+ end
89
+ end
90
+
91
+ def convert_ids(obj)
92
+ if obj.is_a?(String) && obj =~ /^[a-f0-9]{24}$/
93
+ BSON::ObjectId(obj)
94
+ elsif obj.is_a?(Array)
95
+ obj.map do |v|
96
+ convert_ids(v)
97
+ end
98
+ elsif obj.is_a?(Hash)
99
+ obj.each_pair do |k, v|
100
+ obj[k] = convert_ids(v)
101
+ end
102
+ else
103
+ obj
104
+ end
105
+ end
106
+
107
+ def collection_names
108
+ @collection_names ||= get_mongoid_models.map{ |d| d.collection.name }.uniq
109
+ end
110
+
111
+ desc "Convert string objectids in mongo database to ObjectID type"
112
+ task :objectid_convert => :environment do
113
+ collection_names.each do |collection_name|
114
+ puts "Converting #{collection_name} to use ObjectIDs"
115
+
116
+ # get old collection
117
+ collection = Mongoid.master.collection(collection_name)
118
+
119
+ # get new collection (a clean one)
120
+ collection.db["#{collection_name}_new"].drop
121
+ new_collection = collection.db["#{collection_name}_new"]
122
+
123
+ # convert collection documents
124
+ collection.find({}, :timeout => false, :sort => "_id") do |cursor|
125
+ cursor.each do |doc|
126
+ new_doc = convert_ids(doc)
127
+ new_collection.insert(new_doc, :safe => true)
128
+ end
129
+ end
130
+
131
+ puts "Done! Converted collection is in #{new_collection.name}\n\n"
132
+ end
133
+
134
+ # no errors. great! now rename _new to collection_name
135
+ collection_names.each do |collection_name|
136
+ collection = Mongoid.master.collection(collection_name)
137
+ new_collection = collection.db["#{collection_name}_new"]
138
+
139
+ # swap collection to _old
140
+ puts "Moving #{collection.name} to #{collection_name}_old"
141
+ collection.db["#{collection_name}_old"].drop
142
+
143
+ begin
144
+ collection.rename("#{collection_name}_old")
145
+ rescue Exception => e
146
+ puts "Unable to rename database #{collection_name} to #{collection_name}_old"
147
+ puts "reason: #{e.message}\n\n"
148
+ end
149
+
150
+ # swap _new to collection
151
+ puts "Moving #{new_collection.name} to #{collection_name}\n\n"
152
+
153
+ begin
154
+ new_collection.rename(collection_name)
155
+ rescue Exception => e
156
+ puts "Unable to rename database #{new_collection.name} to #{collection_name}"
157
+ puts "reason: #{e.message}\n\n"
158
+ end
159
+ end
160
+
161
+ puts "DONE! Run `rake db:mongoid:cleanup_old_collections` to remove old collections"
162
+ end
163
+
164
+ desc "Clean up old collections backed up by objectid_convert"
165
+ task :cleanup_old_collections => :environment do
166
+ collection_names.each do |collection_name|
167
+ collection = Mongoid.master.collection(collection_name)
168
+ collection.db["#{collection.name}_old"].drop
169
+ end
170
+ end
171
+
172
+ desc "Drops the database for the current Rails.env"
173
+ task :drop => :environment do
174
+ Mongoid.master.collections.select {|c| c.name !~ /system/ }.each { |c| c.drop }
175
+ end
176
+
177
+ ########
178
+ # TODO: lots more useful db tasks can be added here. stuff like copyDatabase, etc
179
+ ########
180
+ end
181
+
182
+ end
@@ -0,0 +1,12 @@
1
+ module Mongoid
2
+ module Document
3
+ # Used in conjunction with fields_for to build a form element for the
4
+ # destruction of this association. Always returns false because Mongoid
5
+ # only supports immediate deletion of associations.
6
+ #
7
+ # See ActionView::Helpers::FormHelper::fields_for for more info.
8
+ def _destroy
9
+ false
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,144 @@
1
+ # encoding: utf-8
2
+ require "mongoid/relations/accessors"
3
+ require "mongoid/relations/auto_save"
4
+ require "mongoid/relations/cascading"
5
+ require "mongoid/relations/constraint"
6
+ require "mongoid/relations/conversions"
7
+ require "mongoid/relations/cyclic"
8
+ require "mongoid/relations/proxy"
9
+ require "mongoid/relations/bindings"
10
+ require "mongoid/relations/builders"
11
+ require "mongoid/relations/many"
12
+ require "mongoid/relations/one"
13
+ require "mongoid/relations/options"
14
+ require "mongoid/relations/polymorphic"
15
+ require "mongoid/relations/targets/enumerable"
16
+ require "mongoid/relations/embedded/atomic"
17
+ require "mongoid/relations/embedded/in"
18
+ require "mongoid/relations/embedded/many"
19
+ require "mongoid/relations/embedded/one"
20
+ require "mongoid/relations/referenced/batch"
21
+ require "mongoid/relations/referenced/in"
22
+ require "mongoid/relations/referenced/many"
23
+ require "mongoid/relations/referenced/many_to_many"
24
+ require "mongoid/relations/referenced/one"
25
+ require "mongoid/relations/reflections"
26
+ require "mongoid/relations/synchronization"
27
+ require "mongoid/relations/metadata"
28
+ require "mongoid/relations/macros"
29
+
30
+ module Mongoid # :nodoc:
31
+
32
+ # All classes and modules under the relations namespace handle the
33
+ # functionality that has to do with embedded and referenced (relational)
34
+ # associations.
35
+ module Relations
36
+ extend ActiveSupport::Concern
37
+ include Accessors
38
+ include AutoSave
39
+ include Cascading
40
+ include Cyclic
41
+ include Builders
42
+ include Macros
43
+ include Polymorphic
44
+ include Reflections
45
+ include Synchronization
46
+
47
+ included do
48
+ attr_accessor :metadata
49
+ end
50
+
51
+ # Determine if the document itself is embedded in another document via the
52
+ # proper channels. (If it has a parent document.)
53
+ #
54
+ # @example Is the document embedded?
55
+ # address.embedded?
56
+ #
57
+ # @return [ true, false ] True if the document has a parent document.
58
+ #
59
+ # @since 2.0.0.rc.1
60
+ def embedded?
61
+ @embedded ||= (cyclic ? _parent.present? : self.class.embedded?)
62
+ end
63
+
64
+ # Determine if the document is part of an embeds_many relation.
65
+ #
66
+ # @example Is the document in an embeds many?
67
+ # address.embedded_many?
68
+ #
69
+ # @return [ true, false ] True if in an embeds many.
70
+ #
71
+ # @since 2.0.0.rc.1
72
+ def embedded_many?
73
+ metadata && metadata.macro == :embeds_many
74
+ end
75
+
76
+ # Determine if the document is part of an embeds_one relation.
77
+ #
78
+ # @example Is the document in an embeds one?
79
+ # address.embedded_one?
80
+ #
81
+ # @return [ true, false ] True if in an embeds one.
82
+ #
83
+ # @since 2.0.0.rc.1
84
+ def embedded_one?
85
+ metadata && metadata.macro == :embeds_one
86
+ end
87
+
88
+ # Determine if the document is part of an references_many relation.
89
+ #
90
+ # @example Is the document in a references many?
91
+ # post.referenced_many?
92
+ #
93
+ # @return [ true, false ] True if in a references many.
94
+ #
95
+ # @since 2.0.0.rc.1
96
+ def referenced_many?
97
+ metadata && metadata.macro == :references_many
98
+ end
99
+
100
+ # Determine if the document is part of an references_one relation.
101
+ #
102
+ # @example Is the document in a references one?
103
+ # address.referenced_one?
104
+ #
105
+ # @return [ true, false ] True if in a references one.
106
+ #
107
+ # @since 2.0.0.rc.1
108
+ def referenced_one?
109
+ metadata && metadata.macro == :references_one
110
+ end
111
+
112
+ # Convenience method for iterating through the loaded relations and
113
+ # reloading them.
114
+ #
115
+ # @example Reload the relations.
116
+ # document.reload_relations
117
+ #
118
+ # @return [ Hash ] The relations metadata.
119
+ #
120
+ # @since 2.1.6
121
+ def reload_relations
122
+ relations.each_pair do |name, meta|
123
+ if instance_variable_defined?("@#{name}")
124
+ remove_instance_variable("@#{name}")
125
+ end
126
+ end
127
+ end
128
+
129
+ module ClassMethods #:nodoc:
130
+
131
+ # This is convenience for librarys still on the old API.
132
+ #
133
+ # @example Get the associations.
134
+ # Person.associations
135
+ #
136
+ # @return [ Hash ] The relations.
137
+ #
138
+ # @since 2.3.1
139
+ def associations
140
+ self.relations
141
+ end
142
+ end
143
+ end
144
+ end