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.
- data/CHANGELOG.md +615 -0
- data/LICENSE +20 -0
- data/README.md +62 -0
- data/Rakefile +49 -0
- data/lib/config/locales/bg.yml +54 -0
- data/lib/config/locales/de.yml +54 -0
- data/lib/config/locales/en-GB.yml +55 -0
- data/lib/config/locales/en.yml +55 -0
- data/lib/config/locales/es.yml +52 -0
- data/lib/config/locales/fr.yml +55 -0
- data/lib/config/locales/hi.yml +46 -0
- data/lib/config/locales/hu.yml +57 -0
- data/lib/config/locales/id.yml +55 -0
- data/lib/config/locales/it.yml +52 -0
- data/lib/config/locales/ja.yml +50 -0
- data/lib/config/locales/kr.yml +47 -0
- data/lib/config/locales/nl.yml +52 -0
- data/lib/config/locales/pl.yml +52 -0
- data/lib/config/locales/pt-BR.yml +53 -0
- data/lib/config/locales/pt.yml +53 -0
- data/lib/config/locales/ro.yml +59 -0
- data/lib/config/locales/ru.yml +54 -0
- data/lib/config/locales/sv.yml +53 -0
- data/lib/config/locales/vi.yml +55 -0
- data/lib/config/locales/zh-CN.yml +46 -0
- data/lib/mongoid.rb +148 -0
- data/lib/mongoid/atomic.rb +230 -0
- data/lib/mongoid/atomic/modifiers.rb +243 -0
- data/lib/mongoid/atomic/paths.rb +3 -0
- data/lib/mongoid/atomic/paths/embedded.rb +43 -0
- data/lib/mongoid/atomic/paths/embedded/many.rb +44 -0
- data/lib/mongoid/atomic/paths/embedded/one.rb +43 -0
- data/lib/mongoid/atomic/paths/root.rb +40 -0
- data/lib/mongoid/attributes.rb +234 -0
- data/lib/mongoid/attributes/processing.rb +146 -0
- data/lib/mongoid/callbacks.rb +135 -0
- data/lib/mongoid/collection.rb +153 -0
- data/lib/mongoid/collection_proxy.rb +59 -0
- data/lib/mongoid/collections.rb +120 -0
- data/lib/mongoid/collections/master.rb +45 -0
- data/lib/mongoid/collections/operations.rb +44 -0
- data/lib/mongoid/collections/retry.rb +46 -0
- data/lib/mongoid/components.rb +96 -0
- data/lib/mongoid/config.rb +347 -0
- data/lib/mongoid/config/database.rb +186 -0
- data/lib/mongoid/config/replset_database.rb +82 -0
- data/lib/mongoid/connection_proxy.rb +30 -0
- data/lib/mongoid/contexts.rb +25 -0
- data/lib/mongoid/contexts/enumerable.rb +288 -0
- data/lib/mongoid/contexts/enumerable/sort.rb +43 -0
- data/lib/mongoid/contexts/mongo.rb +409 -0
- data/lib/mongoid/copyable.rb +48 -0
- data/lib/mongoid/criteria.rb +418 -0
- data/lib/mongoid/criterion/builder.rb +34 -0
- data/lib/mongoid/criterion/complex.rb +84 -0
- data/lib/mongoid/criterion/creational.rb +34 -0
- data/lib/mongoid/criterion/exclusion.rb +108 -0
- data/lib/mongoid/criterion/inclusion.rb +305 -0
- data/lib/mongoid/criterion/inspection.rb +22 -0
- data/lib/mongoid/criterion/optional.rb +232 -0
- data/lib/mongoid/criterion/selector.rb +153 -0
- data/lib/mongoid/cursor.rb +86 -0
- data/lib/mongoid/database_proxy.rb +97 -0
- data/lib/mongoid/default_scope.rb +36 -0
- data/lib/mongoid/dirty.rb +110 -0
- data/lib/mongoid/document.rb +280 -0
- data/lib/mongoid/errors.rb +17 -0
- data/lib/mongoid/errors/callback.rb +26 -0
- data/lib/mongoid/errors/document_not_found.rb +28 -0
- data/lib/mongoid/errors/eager_load.rb +25 -0
- data/lib/mongoid/errors/invalid_collection.rb +18 -0
- data/lib/mongoid/errors/invalid_database.rb +19 -0
- data/lib/mongoid/errors/invalid_field.rb +18 -0
- data/lib/mongoid/errors/invalid_find.rb +19 -0
- data/lib/mongoid/errors/invalid_options.rb +28 -0
- data/lib/mongoid/errors/invalid_time.rb +25 -0
- data/lib/mongoid/errors/invalid_type.rb +25 -0
- data/lib/mongoid/errors/mixed_relations.rb +37 -0
- data/lib/mongoid/errors/mongoid_error.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +20 -0
- data/lib/mongoid/errors/unsaved_document.rb +23 -0
- data/lib/mongoid/errors/unsupported_version.rb +20 -0
- data/lib/mongoid/errors/validations.rb +23 -0
- data/lib/mongoid/extensions.rb +82 -0
- data/lib/mongoid/extensions/array/deletion.rb +29 -0
- data/lib/mongoid/extensions/false_class/equality.rb +26 -0
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +45 -0
- data/lib/mongoid/extensions/hash/scoping.rb +25 -0
- data/lib/mongoid/extensions/integer/checks.rb +23 -0
- data/lib/mongoid/extensions/nil/collectionization.rb +23 -0
- data/lib/mongoid/extensions/object/checks.rb +29 -0
- data/lib/mongoid/extensions/object/reflections.rb +48 -0
- data/lib/mongoid/extensions/object/substitutable.rb +15 -0
- data/lib/mongoid/extensions/object/yoda.rb +44 -0
- data/lib/mongoid/extensions/object_id/conversions.rb +60 -0
- data/lib/mongoid/extensions/proc/scoping.rb +25 -0
- data/lib/mongoid/extensions/string/checks.rb +36 -0
- data/lib/mongoid/extensions/string/conversions.rb +22 -0
- data/lib/mongoid/extensions/string/inflections.rb +118 -0
- data/lib/mongoid/extensions/symbol/checks.rb +23 -0
- data/lib/mongoid/extensions/symbol/inflections.rb +66 -0
- data/lib/mongoid/extensions/true_class/equality.rb +26 -0
- data/lib/mongoid/extras.rb +31 -0
- data/lib/mongoid/factory.rb +46 -0
- data/lib/mongoid/fields.rb +332 -0
- data/lib/mongoid/fields/mappings.rb +41 -0
- data/lib/mongoid/fields/serializable.rb +201 -0
- data/lib/mongoid/fields/serializable/array.rb +49 -0
- data/lib/mongoid/fields/serializable/big_decimal.rb +42 -0
- data/lib/mongoid/fields/serializable/bignum.rb +10 -0
- data/lib/mongoid/fields/serializable/binary.rb +11 -0
- data/lib/mongoid/fields/serializable/boolean.rb +43 -0
- data/lib/mongoid/fields/serializable/date.rb +51 -0
- data/lib/mongoid/fields/serializable/date_time.rb +28 -0
- data/lib/mongoid/fields/serializable/fixnum.rb +10 -0
- data/lib/mongoid/fields/serializable/float.rb +32 -0
- data/lib/mongoid/fields/serializable/foreign_keys/array.rb +42 -0
- data/lib/mongoid/fields/serializable/foreign_keys/object.rb +47 -0
- data/lib/mongoid/fields/serializable/hash.rb +11 -0
- data/lib/mongoid/fields/serializable/integer.rb +44 -0
- data/lib/mongoid/fields/serializable/localized.rb +41 -0
- data/lib/mongoid/fields/serializable/nil_class.rb +38 -0
- data/lib/mongoid/fields/serializable/object.rb +11 -0
- data/lib/mongoid/fields/serializable/object_id.rb +31 -0
- data/lib/mongoid/fields/serializable/range.rb +42 -0
- data/lib/mongoid/fields/serializable/set.rb +42 -0
- data/lib/mongoid/fields/serializable/string.rb +27 -0
- data/lib/mongoid/fields/serializable/symbol.rb +27 -0
- data/lib/mongoid/fields/serializable/time.rb +23 -0
- data/lib/mongoid/fields/serializable/time_with_zone.rb +23 -0
- data/lib/mongoid/fields/serializable/timekeeping.rb +106 -0
- data/lib/mongoid/finders.rb +152 -0
- data/lib/mongoid/hierarchy.rb +120 -0
- data/lib/mongoid/identity.rb +92 -0
- data/lib/mongoid/identity_map.rb +119 -0
- data/lib/mongoid/indexes.rb +54 -0
- data/lib/mongoid/inspection.rb +54 -0
- data/lib/mongoid/javascript.rb +20 -0
- data/lib/mongoid/javascript/functions.yml +63 -0
- data/lib/mongoid/json.rb +16 -0
- data/lib/mongoid/keys.rb +144 -0
- data/lib/mongoid/logger.rb +39 -0
- data/lib/mongoid/matchers.rb +32 -0
- data/lib/mongoid/matchers/all.rb +21 -0
- data/lib/mongoid/matchers/and.rb +30 -0
- data/lib/mongoid/matchers/default.rb +70 -0
- data/lib/mongoid/matchers/exists.rb +23 -0
- data/lib/mongoid/matchers/gt.rb +21 -0
- data/lib/mongoid/matchers/gte.rb +21 -0
- data/lib/mongoid/matchers/in.rb +21 -0
- data/lib/mongoid/matchers/lt.rb +21 -0
- data/lib/mongoid/matchers/lte.rb +21 -0
- data/lib/mongoid/matchers/ne.rb +21 -0
- data/lib/mongoid/matchers/nin.rb +21 -0
- data/lib/mongoid/matchers/or.rb +33 -0
- data/lib/mongoid/matchers/size.rb +21 -0
- data/lib/mongoid/matchers/strategies.rb +93 -0
- data/lib/mongoid/multi_database.rb +31 -0
- data/lib/mongoid/multi_parameter_attributes.rb +106 -0
- data/lib/mongoid/named_scope.rb +146 -0
- data/lib/mongoid/nested_attributes.rb +54 -0
- data/lib/mongoid/observer.rb +170 -0
- data/lib/mongoid/paranoia.rb +158 -0
- data/lib/mongoid/persistence.rb +264 -0
- data/lib/mongoid/persistence/atomic.rb +223 -0
- data/lib/mongoid/persistence/atomic/add_to_set.rb +35 -0
- data/lib/mongoid/persistence/atomic/bit.rb +37 -0
- data/lib/mongoid/persistence/atomic/inc.rb +31 -0
- data/lib/mongoid/persistence/atomic/operation.rb +85 -0
- data/lib/mongoid/persistence/atomic/pop.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull.rb +34 -0
- data/lib/mongoid/persistence/atomic/pull_all.rb +34 -0
- data/lib/mongoid/persistence/atomic/push.rb +31 -0
- data/lib/mongoid/persistence/atomic/push_all.rb +31 -0
- data/lib/mongoid/persistence/atomic/rename.rb +31 -0
- data/lib/mongoid/persistence/atomic/sets.rb +30 -0
- data/lib/mongoid/persistence/atomic/unset.rb +28 -0
- data/lib/mongoid/persistence/deletion.rb +32 -0
- data/lib/mongoid/persistence/insertion.rb +41 -0
- data/lib/mongoid/persistence/modification.rb +37 -0
- data/lib/mongoid/persistence/operations.rb +211 -0
- data/lib/mongoid/persistence/operations/embedded/insert.rb +42 -0
- data/lib/mongoid/persistence/operations/embedded/remove.rb +40 -0
- data/lib/mongoid/persistence/operations/insert.rb +34 -0
- data/lib/mongoid/persistence/operations/remove.rb +33 -0
- data/lib/mongoid/persistence/operations/update.rb +64 -0
- data/lib/mongoid/railtie.rb +126 -0
- data/lib/mongoid/railties/database.rake +182 -0
- data/lib/mongoid/railties/document.rb +12 -0
- data/lib/mongoid/relations.rb +144 -0
- data/lib/mongoid/relations/accessors.rb +138 -0
- data/lib/mongoid/relations/auto_save.rb +38 -0
- data/lib/mongoid/relations/binding.rb +26 -0
- data/lib/mongoid/relations/bindings.rb +9 -0
- data/lib/mongoid/relations/bindings/embedded/in.rb +69 -0
- data/lib/mongoid/relations/bindings/embedded/many.rb +93 -0
- data/lib/mongoid/relations/bindings/embedded/one.rb +61 -0
- data/lib/mongoid/relations/bindings/referenced/in.rb +76 -0
- data/lib/mongoid/relations/bindings/referenced/many.rb +54 -0
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +51 -0
- data/lib/mongoid/relations/bindings/referenced/one.rb +58 -0
- data/lib/mongoid/relations/builder.rb +57 -0
- data/lib/mongoid/relations/builders.rb +83 -0
- data/lib/mongoid/relations/builders/embedded/in.rb +29 -0
- data/lib/mongoid/relations/builders/embedded/many.rb +40 -0
- data/lib/mongoid/relations/builders/embedded/one.rb +30 -0
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +110 -0
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +135 -0
- data/lib/mongoid/relations/builders/referenced/in.rb +26 -0
- data/lib/mongoid/relations/builders/referenced/many.rb +27 -0
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +38 -0
- data/lib/mongoid/relations/builders/referenced/one.rb +26 -0
- data/lib/mongoid/relations/cascading.rb +56 -0
- data/lib/mongoid/relations/cascading/delete.rb +19 -0
- data/lib/mongoid/relations/cascading/destroy.rb +26 -0
- data/lib/mongoid/relations/cascading/nullify.rb +18 -0
- data/lib/mongoid/relations/cascading/strategy.rb +26 -0
- data/lib/mongoid/relations/constraint.rb +42 -0
- data/lib/mongoid/relations/conversions.rb +35 -0
- data/lib/mongoid/relations/cyclic.rb +103 -0
- data/lib/mongoid/relations/embedded/atomic.rb +89 -0
- data/lib/mongoid/relations/embedded/atomic/operation.rb +63 -0
- data/lib/mongoid/relations/embedded/atomic/pull.rb +65 -0
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +59 -0
- data/lib/mongoid/relations/embedded/atomic/set.rb +61 -0
- data/lib/mongoid/relations/embedded/atomic/unset.rb +41 -0
- data/lib/mongoid/relations/embedded/in.rb +220 -0
- data/lib/mongoid/relations/embedded/many.rb +560 -0
- data/lib/mongoid/relations/embedded/one.rb +206 -0
- data/lib/mongoid/relations/embedded/sort.rb +31 -0
- data/lib/mongoid/relations/macros.rb +310 -0
- data/lib/mongoid/relations/many.rb +135 -0
- data/lib/mongoid/relations/metadata.rb +919 -0
- data/lib/mongoid/relations/nested_builder.rb +75 -0
- data/lib/mongoid/relations/one.rb +36 -0
- data/lib/mongoid/relations/options.rb +47 -0
- data/lib/mongoid/relations/polymorphic.rb +40 -0
- data/lib/mongoid/relations/proxy.rb +145 -0
- data/lib/mongoid/relations/referenced/batch.rb +72 -0
- data/lib/mongoid/relations/referenced/batch/insert.rb +57 -0
- data/lib/mongoid/relations/referenced/in.rb +262 -0
- data/lib/mongoid/relations/referenced/many.rb +623 -0
- data/lib/mongoid/relations/referenced/many_to_many.rb +396 -0
- data/lib/mongoid/relations/referenced/one.rb +272 -0
- data/lib/mongoid/relations/reflections.rb +62 -0
- data/lib/mongoid/relations/synchronization.rb +153 -0
- data/lib/mongoid/relations/targets.rb +2 -0
- data/lib/mongoid/relations/targets/enumerable.rb +372 -0
- data/lib/mongoid/reloading.rb +91 -0
- data/lib/mongoid/safety.rb +105 -0
- data/lib/mongoid/scope.rb +31 -0
- data/lib/mongoid/serialization.rb +134 -0
- data/lib/mongoid/sharding.rb +61 -0
- data/lib/mongoid/state.rb +97 -0
- data/lib/mongoid/threaded.rb +530 -0
- data/lib/mongoid/threaded/lifecycle.rb +192 -0
- data/lib/mongoid/timestamps.rb +15 -0
- data/lib/mongoid/timestamps/created.rb +24 -0
- data/lib/mongoid/timestamps/timeless.rb +50 -0
- data/lib/mongoid/timestamps/updated.rb +26 -0
- data/lib/mongoid/validations.rb +140 -0
- data/lib/mongoid/validations/associated.rb +46 -0
- data/lib/mongoid/validations/uniqueness.rb +145 -0
- data/lib/mongoid/version.rb +4 -0
- data/lib/mongoid/versioning.rb +185 -0
- data/lib/rack/mongoid.rb +2 -0
- data/lib/rack/mongoid/middleware/identity_map.rb +38 -0
- data/lib/rails/generators/mongoid/config/config_generator.rb +25 -0
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +20 -0
- data/lib/rails/generators/mongoid/model/model_generator.rb +24 -0
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +19 -0
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +17 -0
- data/lib/rails/generators/mongoid/observer/templates/observer.rb.tt +4 -0
- data/lib/rails/generators/mongoid_generator.rb +70 -0
- data/lib/rails/mongoid.rb +91 -0
- 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
|