mongoid-multi-db 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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