mongoid 2.8.1 → 3.0.0.rc
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 +802 -58
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +2 -8
- data/lib/config/locales/en.yml +441 -51
- data/lib/mongoid.rb +24 -39
- data/lib/mongoid/atomic.rb +16 -33
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- data/lib/mongoid/atomic/paths/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/embedded/many.rb +6 -6
- data/lib/mongoid/atomic/paths/embedded/one.rb +5 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/callbacks.rb +90 -27
- data/lib/mongoid/collections/retry.rb +2 -3
- data/lib/mongoid/components.rb +11 -23
- data/lib/mongoid/config.rb +87 -233
- data/lib/mongoid/config/environment.rb +5 -6
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/contextual/aggregable/memory.rb +98 -0
- data/lib/mongoid/contextual/aggregable/mongo.rb +181 -0
- data/lib/mongoid/contextual/atomic.rb +179 -0
- data/lib/mongoid/contextual/command.rb +43 -0
- data/lib/mongoid/contextual/find_and_modify.rb +66 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +383 -0
- data/lib/mongoid/contextual/mongo.rb +543 -0
- data/lib/mongoid/copyable.rb +3 -34
- data/lib/mongoid/criteria.rb +436 -250
- data/lib/mongoid/criterion/inspection.rb +14 -8
- data/lib/mongoid/criterion/scoping.rb +114 -44
- data/lib/mongoid/dirty.rb +152 -67
- data/lib/mongoid/document.rb +69 -50
- data/lib/mongoid/errors.rb +22 -1
- data/lib/mongoid/errors/ambiguous_relationship.rb +51 -0
- data/lib/mongoid/errors/callback.rb +5 -6
- data/lib/mongoid/errors/delete_restriction.rb +29 -0
- data/lib/mongoid/errors/document_not_found.rb +98 -17
- data/lib/mongoid/errors/eager_load.rb +3 -6
- data/lib/mongoid/errors/invalid_collection.rb +3 -3
- data/lib/mongoid/errors/invalid_config_option.rb +27 -0
- data/lib/mongoid/errors/invalid_database.rb +3 -3
- data/lib/mongoid/errors/invalid_field.rb +54 -8
- data/lib/mongoid/errors/invalid_field_option.rb +35 -0
- data/lib/mongoid/errors/invalid_find.rb +3 -3
- data/lib/mongoid/errors/invalid_index.rb +28 -0
- data/lib/mongoid/errors/invalid_options.rb +4 -4
- data/lib/mongoid/errors/invalid_scope.rb +24 -0
- data/lib/mongoid/errors/invalid_set_polymorphic_relation.rb +38 -0
- data/lib/mongoid/errors/invalid_storage_options.rb +27 -0
- data/lib/mongoid/errors/invalid_time.rb +3 -6
- data/lib/mongoid/errors/inverse_not_found.rb +29 -0
- data/lib/mongoid/errors/mixed_relations.rb +4 -9
- data/lib/mongoid/errors/mixed_session_configuration.rb +28 -0
- data/lib/mongoid/errors/mongoid_error.rb +54 -3
- data/lib/mongoid/errors/nested_attributes_metadata_not_found.rb +28 -0
- data/lib/mongoid/errors/no_default_session.rb +23 -0
- data/lib/mongoid/errors/no_environment.rb +3 -3
- data/lib/mongoid/errors/no_map_reduce_output.rb +24 -0
- data/lib/mongoid/errors/no_parent.rb +24 -0
- data/lib/mongoid/errors/no_session_config.rb +22 -0
- data/lib/mongoid/errors/no_session_database.rb +27 -0
- data/lib/mongoid/errors/no_session_hosts.rb +27 -0
- data/lib/mongoid/errors/no_sessions_config.rb +20 -0
- data/lib/mongoid/errors/readonly_attribute.rb +25 -0
- data/lib/mongoid/errors/scope_overwrite.rb +4 -4
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +4 -4
- data/lib/mongoid/errors/unknown_attribute.rb +25 -0
- data/lib/mongoid/errors/unsaved_document.rb +4 -8
- data/lib/mongoid/errors/unsupported_javascript.rb +27 -0
- data/lib/mongoid/errors/unsupported_version.rb +4 -4
- data/lib/mongoid/errors/validations.rb +7 -6
- data/lib/mongoid/errors/versioning_not_on_root.rb +23 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/extensions/array.rb +127 -0
- data/lib/mongoid/extensions/big_decimal.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +24 -0
- data/lib/mongoid/extensions/date.rb +70 -0
- data/lib/mongoid/extensions/date_time.rb +68 -0
- data/lib/mongoid/extensions/false_class.rb +26 -0
- data/lib/mongoid/extensions/float.rb +44 -0
- data/lib/mongoid/extensions/hash.rb +91 -0
- data/lib/mongoid/extensions/integer.rb +54 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +188 -0
- data/lib/mongoid/extensions/object_id.rb +53 -0
- data/lib/mongoid/extensions/range.rb +55 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +155 -0
- data/lib/mongoid/extensions/symbol.rb +54 -0
- data/lib/mongoid/extensions/time.rb +78 -0
- data/lib/mongoid/extensions/time_with_zone.rb +55 -0
- data/lib/mongoid/extensions/true_class.rb +26 -0
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields.rb +129 -194
- data/lib/mongoid/fields/foreign_key.rb +134 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/finders.rb +42 -43
- data/lib/mongoid/hierarchy.rb +25 -14
- data/lib/mongoid/identity_map.rb +31 -19
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/javascript.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- data/lib/mongoid/matchers.rb +1 -1
- data/lib/mongoid/matchers/all.rb +7 -8
- data/lib/mongoid/matchers/and.rb +3 -3
- data/lib/mongoid/matchers/default.rb +6 -4
- data/lib/mongoid/matchers/exists.rb +2 -2
- data/lib/mongoid/matchers/gt.rb +2 -2
- data/lib/mongoid/matchers/gte.rb +2 -2
- data/lib/mongoid/matchers/in.rb +3 -7
- data/lib/mongoid/matchers/lt.rb +2 -2
- data/lib/mongoid/matchers/lte.rb +2 -2
- data/lib/mongoid/matchers/ne.rb +2 -2
- data/lib/mongoid/matchers/nin.rb +2 -2
- data/lib/mongoid/matchers/or.rb +2 -2
- data/lib/mongoid/matchers/size.rb +2 -2
- data/lib/mongoid/matchers/strategies.rb +3 -3
- data/lib/mongoid/multi_parameter_attributes.rb +8 -10
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +13 -18
- data/lib/mongoid/persistence.rb +43 -39
- data/lib/mongoid/persistence/atomic.rb +2 -2
- data/lib/mongoid/persistence/atomic/add_to_set.rb +5 -9
- data/lib/mongoid/persistence/atomic/bit.rb +5 -7
- data/lib/mongoid/persistence/atomic/inc.rb +5 -7
- data/lib/mongoid/persistence/atomic/operation.rb +45 -6
- data/lib/mongoid/persistence/atomic/pop.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull.rb +5 -7
- data/lib/mongoid/persistence/atomic/pull_all.rb +5 -7
- data/lib/mongoid/persistence/atomic/push.rb +4 -10
- data/lib/mongoid/persistence/atomic/push_all.rb +4 -10
- data/lib/mongoid/persistence/atomic/rename.rb +6 -7
- data/lib/mongoid/persistence/atomic/sets.rb +5 -7
- data/lib/mongoid/persistence/atomic/unset.rb +4 -5
- data/lib/mongoid/persistence/deletion.rb +2 -2
- data/lib/mongoid/persistence/insertion.rb +10 -16
- data/lib/mongoid/persistence/modification.rb +5 -9
- data/lib/mongoid/persistence/operations.rb +6 -19
- data/lib/mongoid/persistence/operations/embedded/insert.rb +7 -6
- data/lib/mongoid/persistence/operations/embedded/remove.rb +5 -5
- data/lib/mongoid/persistence/operations/insert.rb +4 -4
- data/lib/mongoid/persistence/operations/remove.rb +4 -4
- data/lib/mongoid/persistence/operations/update.rb +5 -5
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations.rb +4 -6
- data/lib/mongoid/relations/accessors.rb +119 -19
- data/lib/mongoid/relations/auto_save.rb +59 -5
- data/lib/mongoid/relations/binding.rb +211 -2
- data/lib/mongoid/relations/bindings/embedded/in.rb +16 -22
- data/lib/mongoid/relations/bindings/embedded/many.rb +9 -50
- data/lib/mongoid/relations/bindings/embedded/one.rb +10 -16
- data/lib/mongoid/relations/bindings/referenced/in.rb +31 -57
- data/lib/mongoid/relations/bindings/referenced/many.rb +8 -20
- data/lib/mongoid/relations/bindings/referenced/many_to_many.rb +15 -19
- data/lib/mongoid/relations/bindings/referenced/one.rb +10 -24
- data/lib/mongoid/relations/builder.rb +3 -3
- data/lib/mongoid/relations/builders.rb +19 -16
- data/lib/mongoid/relations/builders/embedded/in.rb +5 -5
- data/lib/mongoid/relations/builders/embedded/many.rb +12 -12
- data/lib/mongoid/relations/builders/embedded/one.rb +6 -6
- data/lib/mongoid/relations/builders/nested_attributes/many.rb +8 -8
- data/lib/mongoid/relations/builders/nested_attributes/one.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +5 -5
- data/lib/mongoid/relations/builders/referenced/many_to_many.rb +7 -5
- data/lib/mongoid/relations/builders/referenced/one.rb +5 -5
- data/lib/mongoid/relations/cascading.rb +6 -4
- data/lib/mongoid/relations/cascading/delete.rb +3 -5
- data/lib/mongoid/relations/cascading/destroy.rb +3 -3
- data/lib/mongoid/relations/cascading/nullify.rb +3 -3
- data/lib/mongoid/relations/cascading/restrict.rb +37 -0
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +5 -6
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +346 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +99 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -61
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +200 -45
- data/lib/mongoid/relations/nested_builder.rb +3 -5
- data/lib/mongoid/relations/one.rb +2 -2
- data/lib/mongoid/relations/options.rb +2 -2
- data/lib/mongoid/relations/polymorphic.rb +9 -9
- data/lib/mongoid/relations/proxy.rb +60 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +117 -132
- data/lib/mongoid/relations/referenced/many_to_many.rb +101 -46
- data/lib/mongoid/relations/referenced/one.rb +34 -13
- data/lib/mongoid/relations/reflections.rb +3 -3
- data/lib/mongoid/relations/synchronization.rb +19 -23
- data/lib/mongoid/relations/targets/enumerable.rb +86 -57
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +329 -0
- data/lib/mongoid/serialization.rb +8 -27
- data/lib/mongoid/sessions.rb +359 -0
- data/lib/mongoid/sessions/factory.rb +106 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded.rb +167 -59
- data/lib/mongoid/threaded/lifecycle.rb +21 -22
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +3 -3
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations.rb +27 -19
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +31 -5
- data/lib/mongoid/validations/uniqueness.rb +9 -12
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/rack/mongoid/middleware/identity_map.rb +3 -3
- data/lib/rails/generators/mongoid/config/config_generator.rb +1 -1
- data/lib/rails/generators/mongoid/config/templates/mongoid.yml +59 -19
- data/lib/rails/generators/mongoid/model/model_generator.rb +7 -7
- data/lib/rails/generators/mongoid/model/templates/model.rb.tt +2 -2
- data/lib/rails/generators/mongoid/observer/observer_generator.rb +4 -4
- data/lib/rails/generators/mongoid_generator.rb +5 -5
- data/lib/rails/mongoid.rb +69 -25
- metadata +110 -137
- checksums.yaml +0 -7
- data/lib/config/locales/bg.yml +0 -61
- data/lib/config/locales/de.yml +0 -61
- data/lib/config/locales/en-GB.yml +0 -64
- data/lib/config/locales/es.yml +0 -59
- data/lib/config/locales/fr.yml +0 -62
- data/lib/config/locales/hi.yml +0 -53
- data/lib/config/locales/hu.yml +0 -64
- data/lib/config/locales/id.yml +0 -62
- data/lib/config/locales/it.yml +0 -59
- data/lib/config/locales/ja.yml +0 -57
- data/lib/config/locales/kr.yml +0 -54
- data/lib/config/locales/nl.yml +0 -61
- data/lib/config/locales/pl.yml +0 -59
- data/lib/config/locales/pt-BR.yml +0 -60
- data/lib/config/locales/pt.yml +0 -60
- data/lib/config/locales/ro.yml +0 -66
- data/lib/config/locales/ru.yml +0 -61
- data/lib/config/locales/sv.yml +0 -60
- data/lib/config/locales/vi.yml +0 -62
- data/lib/config/locales/zh-CN.yml +0 -53
- data/lib/mongoid/collection.rb +0 -157
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/collections/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts.rb +0 -25
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/criterion/builder.rb +0 -34
- data/lib/mongoid/criterion/complex.rb +0 -84
- data/lib/mongoid/criterion/creational.rb +0 -34
- data/lib/mongoid/criterion/exclusion.rb +0 -110
- data/lib/mongoid/criterion/inclusion.rb +0 -290
- data/lib/mongoid/criterion/optional.rb +0 -259
- data/lib/mongoid/criterion/selector.rb +0 -177
- data/lib/mongoid/cursor.rb +0 -88
- data/lib/mongoid/default_scope.rb +0 -36
- data/lib/mongoid/errors/invalid_type.rb +0 -25
- data/lib/mongoid/extensions/array/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/array/deletion.rb +0 -29
- data/lib/mongoid/extensions/false_class/equality.rb +0 -26
- data/lib/mongoid/extensions/hash/criteria_helpers.rb +0 -47
- data/lib/mongoid/extensions/hash/deep_copy.rb +0 -25
- data/lib/mongoid/extensions/hash/scoping.rb +0 -25
- data/lib/mongoid/extensions/integer/checks.rb +0 -23
- data/lib/mongoid/extensions/nil/collectionization.rb +0 -23
- data/lib/mongoid/extensions/object/checks.rb +0 -29
- data/lib/mongoid/extensions/object/deep_copy.rb +0 -21
- data/lib/mongoid/extensions/object/reflections.rb +0 -48
- data/lib/mongoid/extensions/object/substitutable.rb +0 -15
- data/lib/mongoid/extensions/object/yoda.rb +0 -44
- data/lib/mongoid/extensions/object_id/conversions.rb +0 -60
- data/lib/mongoid/extensions/proc/scoping.rb +0 -25
- data/lib/mongoid/extensions/string/checks.rb +0 -36
- data/lib/mongoid/extensions/string/conversions.rb +0 -22
- data/lib/mongoid/extensions/string/inflections.rb +0 -118
- data/lib/mongoid/extensions/symbol/checks.rb +0 -23
- data/lib/mongoid/extensions/symbol/inflections.rb +0 -67
- data/lib/mongoid/extensions/true_class/equality.rb +0 -26
- data/lib/mongoid/extras.rb +0 -31
- data/lib/mongoid/fields/internal/array.rb +0 -77
- data/lib/mongoid/fields/internal/big_decimal.rb +0 -63
- data/lib/mongoid/fields/internal/bignum.rb +0 -10
- data/lib/mongoid/fields/internal/binary.rb +0 -11
- data/lib/mongoid/fields/internal/boolean.rb +0 -58
- data/lib/mongoid/fields/internal/date.rb +0 -51
- data/lib/mongoid/fields/internal/date_time.rb +0 -28
- data/lib/mongoid/fields/internal/false_class.rb +0 -10
- data/lib/mongoid/fields/internal/fixnum.rb +0 -10
- data/lib/mongoid/fields/internal/float.rb +0 -47
- data/lib/mongoid/fields/internal/foreign_keys/array.rb +0 -88
- data/lib/mongoid/fields/internal/foreign_keys/object.rb +0 -56
- data/lib/mongoid/fields/internal/hash.rb +0 -11
- data/lib/mongoid/fields/internal/integer.rb +0 -59
- data/lib/mongoid/fields/internal/localized.rb +0 -62
- data/lib/mongoid/fields/internal/nil_class.rb +0 -53
- data/lib/mongoid/fields/internal/object.rb +0 -11
- data/lib/mongoid/fields/internal/object_id.rb +0 -46
- data/lib/mongoid/fields/internal/range.rb +0 -61
- data/lib/mongoid/fields/internal/set.rb +0 -57
- data/lib/mongoid/fields/internal/string.rb +0 -42
- data/lib/mongoid/fields/internal/symbol.rb +0 -43
- data/lib/mongoid/fields/internal/time.rb +0 -23
- data/lib/mongoid/fields/internal/time_with_zone.rb +0 -23
- data/lib/mongoid/fields/internal/timekeeping.rb +0 -122
- data/lib/mongoid/fields/internal/true_class.rb +0 -10
- data/lib/mongoid/fields/mappings.rb +0 -42
- data/lib/mongoid/fields/serializable.rb +0 -270
- data/lib/mongoid/identity.rb +0 -92
- data/lib/mongoid/keys.rb +0 -144
- data/lib/mongoid/logger.rb +0 -45
- data/lib/mongoid/multi_database.rb +0 -36
- data/lib/mongoid/named_scope.rb +0 -166
- data/lib/mongoid/relations/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/embedded/atomic/operation.rb +0 -63
- data/lib/mongoid/relations/embedded/atomic/pull.rb +0 -65
- data/lib/mongoid/relations/embedded/atomic/push_all.rb +0 -59
- data/lib/mongoid/relations/embedded/atomic/set.rb +0 -61
- data/lib/mongoid/relations/embedded/atomic/unset.rb +0 -41
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/safety.rb +0 -105
- data/lib/mongoid/scope.rb +0 -31
@@ -1,27 +1,27 @@
|
|
1
1
|
namespace :db do
|
2
2
|
|
3
3
|
unless Rake::Task.task_defined?("db:drop")
|
4
|
-
desc
|
4
|
+
desc "Drops all the collections for the database for the current Rails.env"
|
5
5
|
task :drop => "mongoid:drop"
|
6
6
|
end
|
7
7
|
|
8
8
|
unless Rake::Task.task_defined?("db:seed")
|
9
|
-
# if another ORM has defined db:seed, don
|
10
|
-
desc
|
9
|
+
# if another ORM has defined db:seed, don"t run it twice.
|
10
|
+
desc "Load the seed data from db/seeds.rb"
|
11
11
|
task :seed => :environment do
|
12
|
-
seed_file = File.join(Rails.root,
|
12
|
+
seed_file = File.join(Rails.root, "db", "seeds.rb")
|
13
13
|
load(seed_file) if File.exist?(seed_file)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
17
|
unless Rake::Task.task_defined?("db:setup")
|
18
|
-
desc
|
19
|
-
task :setup => [
|
18
|
+
desc "Create the database, and initialize with the seed data"
|
19
|
+
task :setup => [ "db:create", "db:mongoid:create_indexes", "db:seed" ]
|
20
20
|
end
|
21
21
|
|
22
22
|
unless Rake::Task.task_defined?("db:reseed")
|
23
|
-
desc
|
24
|
-
task :reseed => [
|
23
|
+
desc "Delete data and seed"
|
24
|
+
task :reseed => [ "db:drop", "db:seed" ]
|
25
25
|
end
|
26
26
|
|
27
27
|
unless Rake::Task.task_defined?("db:create")
|
@@ -56,26 +56,13 @@ namespace :db do
|
|
56
56
|
task :create_indexes => "mongoid:create_indexes"
|
57
57
|
end
|
58
58
|
|
59
|
+
unless Rake::Task.task_defined?("db:remove_indexes")
|
60
|
+
task :remove_indexes => "mongoid:remove_indexes"
|
61
|
+
end
|
62
|
+
|
59
63
|
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
64
|
|
78
|
-
desc
|
65
|
+
desc "Create the indexes defined on your mongoid models"
|
79
66
|
task :create_indexes => :environment do
|
80
67
|
engines_models_paths = Rails.application.railties.engines.map do |engine|
|
81
68
|
engine.paths["app/models"].expanded
|
@@ -88,95 +75,22 @@ namespace :db do
|
|
88
75
|
end
|
89
76
|
end
|
90
77
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
|
78
|
+
desc "Remove the indexes defined on your mongoid models without questions!"
|
79
|
+
task :remove_indexes => :environment do
|
80
|
+
engines_models_paths = Rails.application.railties.engines.map do |engine|
|
81
|
+
engine.paths["app/models"].expanded
|
159
82
|
end
|
83
|
+
root_models_paths = Rails.application.paths["app/models"]
|
84
|
+
models_paths = engines_models_paths.push(root_models_paths).flatten
|
160
85
|
|
161
|
-
|
162
|
-
|
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
|
86
|
+
models_paths.each do |path|
|
87
|
+
::Rails::Mongoid.remove_indexes("#{path}/**/*.rb")
|
169
88
|
end
|
170
89
|
end
|
171
90
|
|
172
91
|
desc "Drops the database for the current Rails.env"
|
173
92
|
task :drop => :environment do
|
174
|
-
Mongoid.
|
93
|
+
::Mongoid::Sessions.default.drop
|
175
94
|
end
|
176
|
-
|
177
|
-
########
|
178
|
-
# TODO: lots more useful db tasks can be added here. stuff like copyDatabase, etc
|
179
|
-
########
|
180
95
|
end
|
181
|
-
|
182
96
|
end
|
data/lib/mongoid/relations.rb
CHANGED
@@ -13,11 +13,9 @@ require "mongoid/relations/one"
|
|
13
13
|
require "mongoid/relations/options"
|
14
14
|
require "mongoid/relations/polymorphic"
|
15
15
|
require "mongoid/relations/targets/enumerable"
|
16
|
-
require "mongoid/relations/embedded/atomic"
|
17
16
|
require "mongoid/relations/embedded/in"
|
18
17
|
require "mongoid/relations/embedded/many"
|
19
18
|
require "mongoid/relations/embedded/one"
|
20
|
-
require "mongoid/relations/referenced/batch"
|
21
19
|
require "mongoid/relations/referenced/in"
|
22
20
|
require "mongoid/relations/referenced/many"
|
23
21
|
require "mongoid/relations/referenced/many_to_many"
|
@@ -28,7 +26,7 @@ require "mongoid/relations/touchable"
|
|
28
26
|
require "mongoid/relations/metadata"
|
29
27
|
require "mongoid/relations/macros"
|
30
28
|
|
31
|
-
module Mongoid
|
29
|
+
module Mongoid
|
32
30
|
|
33
31
|
# All classes and modules under the relations namespace handle the
|
34
32
|
# functionality that has to do with embedded and referenced (relational)
|
@@ -94,7 +92,7 @@ module Mongoid # :nodoc:
|
|
94
92
|
#
|
95
93
|
# @since 2.0.0.rc.1
|
96
94
|
def referenced_many?
|
97
|
-
metadata && metadata.macro == :
|
95
|
+
metadata && metadata.macro == :has_many
|
98
96
|
end
|
99
97
|
|
100
98
|
# Determine if the document is part of an references_one relation.
|
@@ -106,7 +104,7 @@ module Mongoid # :nodoc:
|
|
106
104
|
#
|
107
105
|
# @since 2.0.0.rc.1
|
108
106
|
def referenced_one?
|
109
|
-
metadata && metadata.macro == :
|
107
|
+
metadata && metadata.macro == :has_one
|
110
108
|
end
|
111
109
|
|
112
110
|
# Convenience method for iterating through the loaded relations and
|
@@ -128,7 +126,7 @@ module Mongoid # :nodoc:
|
|
128
126
|
end
|
129
127
|
end
|
130
128
|
|
131
|
-
module ClassMethods
|
129
|
+
module ClassMethods
|
132
130
|
|
133
131
|
# This is convenience for librarys still on the old API.
|
134
132
|
#
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Relations
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
4
|
|
5
5
|
# This module contains all the behaviour related to accessing relations
|
6
6
|
# through the getters and setters, and how to delegate to builders to
|
@@ -12,7 +12,7 @@ module Mongoid # :nodoc:
|
|
12
12
|
# document is nil, then sets the relation on this document.
|
13
13
|
#
|
14
14
|
# @example Build the relation.
|
15
|
-
# person.
|
15
|
+
# person.__build__(:addresses, { :id => 1 }, metadata)
|
16
16
|
#
|
17
17
|
# @param [ String, Symbol ] name The name of the relation.
|
18
18
|
# @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
|
@@ -22,7 +22,7 @@ module Mongoid # :nodoc:
|
|
22
22
|
# @return [ Proxy ] The relation.
|
23
23
|
#
|
24
24
|
# @since 2.0.0.rc.1
|
25
|
-
def
|
25
|
+
def __build__(name, object, metadata)
|
26
26
|
relation = create_relation(object, metadata)
|
27
27
|
set_relation(name, relation)
|
28
28
|
end
|
@@ -74,7 +74,64 @@ module Mongoid # :nodoc:
|
|
74
74
|
instance_variable_set("@#{name}", relation)
|
75
75
|
end
|
76
76
|
|
77
|
-
|
77
|
+
private
|
78
|
+
|
79
|
+
# Is the current code executing without autobuild functionality?
|
80
|
+
#
|
81
|
+
# @example Is autobuild disabled?
|
82
|
+
# document.without_autobuild?
|
83
|
+
#
|
84
|
+
# @return [ true, false ] If autobuild is disabled.
|
85
|
+
#
|
86
|
+
# @since 3.0.0
|
87
|
+
def without_autobuild?
|
88
|
+
Threaded.executing?(:without_autobuild)
|
89
|
+
end
|
90
|
+
|
91
|
+
# Yield to the block with autobuild functionality turned off.
|
92
|
+
#
|
93
|
+
# @example Execute without autobuild.
|
94
|
+
# document.without_autobuild do
|
95
|
+
# document.name
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# @return [ Object ] The result of the yield.
|
99
|
+
#
|
100
|
+
# @since 3.0.0
|
101
|
+
def without_autobuild
|
102
|
+
Threaded.begin("without_autobuild")
|
103
|
+
yield
|
104
|
+
ensure
|
105
|
+
Threaded.exit("without_autobuild")
|
106
|
+
end
|
107
|
+
|
108
|
+
module ClassMethods
|
109
|
+
|
110
|
+
# Adds the existence check for relations.
|
111
|
+
#
|
112
|
+
# @example Add the existence check.
|
113
|
+
# Person.existence_check(:name, meta)
|
114
|
+
#
|
115
|
+
# @example Check if a relation exists.
|
116
|
+
# person = Person.new
|
117
|
+
# person.has_game?
|
118
|
+
# person.game?
|
119
|
+
#
|
120
|
+
# @param [ String, Symbol ] name The name of the relation.
|
121
|
+
# @param [ Metadata ] The metadata.
|
122
|
+
#
|
123
|
+
# @return [ Class ] The model being set up.
|
124
|
+
#
|
125
|
+
# @since 3.0.0
|
126
|
+
def existence_check(name, metadata)
|
127
|
+
module_eval <<-END
|
128
|
+
def #{name}?
|
129
|
+
without_autobuild { !#{name}.blank? }
|
130
|
+
end
|
131
|
+
alias :has_#{name}? :#{name}?
|
132
|
+
END
|
133
|
+
self
|
134
|
+
end
|
78
135
|
|
79
136
|
# Defines the getter for the relation. Nothing too special here: just
|
80
137
|
# return the instance variable for the relation if it exists or build
|
@@ -90,22 +147,43 @@ module Mongoid # :nodoc:
|
|
90
147
|
#
|
91
148
|
# @since 2.0.0.rc.1
|
92
149
|
def getter(name, metadata)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
_loading do
|
101
|
-
build(name, attributes[metadata.key], metadata)
|
102
|
-
end
|
103
|
-
end
|
150
|
+
re_define_method(name) do |*args|
|
151
|
+
reload, variable = args.first, "@#{name}"
|
152
|
+
value = if instance_variable_defined?(variable) && !reload
|
153
|
+
instance_variable_get(variable)
|
154
|
+
else
|
155
|
+
_building do
|
156
|
+
_loading { __build__(name, attributes[metadata.key], metadata) }
|
104
157
|
end
|
105
158
|
end
|
159
|
+
if value.nil? && metadata.autobuilding? && !without_autobuild?
|
160
|
+
send("build_#{name}")
|
161
|
+
else
|
162
|
+
value
|
163
|
+
end
|
164
|
+
end
|
165
|
+
self
|
166
|
+
end
|
167
|
+
|
168
|
+
# Defines the getter for the ids of documents in the relation. Should
|
169
|
+
# be specify only for referenced many relations.
|
170
|
+
#
|
171
|
+
# @example Set up the ids getter for the relation.
|
172
|
+
# Person.ids_getter("addresses", metadata)
|
173
|
+
#
|
174
|
+
# @param [ String, Symbol ] name The name of the relation.
|
175
|
+
# @param [ Metadata] metadata The metadata for the relation.
|
176
|
+
#
|
177
|
+
# @return [ Class ] The class being set up.
|
178
|
+
def ids_getter(name, metadata)
|
179
|
+
ids_method = "#{name.to_s.singularize}_ids"
|
180
|
+
re_define_method(ids_method) do
|
181
|
+
send(name).only(:id).map(&:id)
|
106
182
|
end
|
183
|
+
self
|
107
184
|
end
|
108
185
|
|
186
|
+
|
109
187
|
# Defines the setter for the relation. This does a few things based on
|
110
188
|
# some conditions. If there is an existing association, a target
|
111
189
|
# substitution will take place, otherwise a new relation will be
|
@@ -121,16 +199,38 @@ module Mongoid # :nodoc:
|
|
121
199
|
#
|
122
200
|
# @since 2.0.0.rc.1
|
123
201
|
def setter(name, metadata)
|
124
|
-
|
125
|
-
|
202
|
+
re_define_method("#{name}=") do |object|
|
203
|
+
without_autobuild do
|
126
204
|
if relation_exists?(name) || metadata.many? ||
|
127
205
|
(object.blank? && send(name))
|
128
206
|
set_relation(name, send(name).substitute(object.substitutable))
|
129
207
|
else
|
130
|
-
|
208
|
+
__build__(name, object.substitutable, metadata)
|
131
209
|
end
|
132
210
|
end
|
133
211
|
end
|
212
|
+
self
|
213
|
+
end
|
214
|
+
|
215
|
+
# Defines the setter method that allows you to set documents
|
216
|
+
# in this relation by their ids. The defined setter, finds
|
217
|
+
# documents with given ids and invokes regular relation setter
|
218
|
+
# with found documents. Ids setters should be defined only for
|
219
|
+
# referenced many relations.
|
220
|
+
#
|
221
|
+
# @example Set up the id_setter for the relation.
|
222
|
+
# Person.ids_setter("addesses", metadata)
|
223
|
+
#
|
224
|
+
# @param [ String, Symbol ] name The name of the relation.
|
225
|
+
# @param [ Metadata ] metadata The metadata for the relation.
|
226
|
+
#
|
227
|
+
# @return [ Class ] The class being set up.
|
228
|
+
def ids_setter(name, metadata)
|
229
|
+
ids_method = "#{name.to_s.singularize}_ids="
|
230
|
+
re_define_method(ids_method) do |ids|
|
231
|
+
send(metadata.setter, metadata.klass.find(ids))
|
232
|
+
end
|
233
|
+
self
|
134
234
|
end
|
135
235
|
end
|
136
236
|
end
|
@@ -1,13 +1,50 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
module Mongoid
|
3
|
-
module Relations
|
2
|
+
module Mongoid
|
3
|
+
module Relations
|
4
4
|
|
5
5
|
# This module contains the behaviour for auto-saving relations in
|
6
6
|
# different collections.
|
7
7
|
module AutoSave
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
-
|
10
|
+
included do
|
11
|
+
class_attribute :autosaved_relations
|
12
|
+
self.autosaved_relations = []
|
13
|
+
end
|
14
|
+
|
15
|
+
# Used to prevent infinite loops in associated autosaves.
|
16
|
+
#
|
17
|
+
# @example Is the document autosaved?
|
18
|
+
# document.autosaved?
|
19
|
+
#
|
20
|
+
# @return [ true, false ] Has the document already been autosaved?
|
21
|
+
#
|
22
|
+
# @since 3.0.0
|
23
|
+
def autosaved?
|
24
|
+
Threaded.autosaved?(self)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Begin the associated autosave.
|
28
|
+
#
|
29
|
+
# @example Begin autosave.
|
30
|
+
# document.begin_autosave
|
31
|
+
#
|
32
|
+
# @since 3.0.0
|
33
|
+
def begin_autosave
|
34
|
+
Threaded.begin_autosave(self)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Exit the associated autosave.
|
38
|
+
#
|
39
|
+
# @example Exit autosave.
|
40
|
+
# document.exit_autosave
|
41
|
+
#
|
42
|
+
# @since 3.0.0
|
43
|
+
def exit_autosave
|
44
|
+
Threaded.exit_autosave(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
module ClassMethods
|
11
48
|
|
12
49
|
# Set up the autosave behaviour for references many and references one
|
13
50
|
# relations. When the option is set to true, these relations will get
|
@@ -21,17 +58,34 @@ module Mongoid # :nodoc:
|
|
21
58
|
#
|
22
59
|
# @since 2.0.0.rc.1
|
23
60
|
def autosave(metadata)
|
24
|
-
if metadata.autosave?
|
25
|
-
|
61
|
+
if metadata.autosave? && autosavable?(metadata)
|
62
|
+
autosaved_relations.push(metadata.name)
|
63
|
+
set_callback :save, :after, unless: :autosaved? do |document|
|
64
|
+
begin_autosave
|
26
65
|
relation = document.send(metadata.name)
|
27
66
|
if relation
|
28
67
|
(relation.do_or_do_not(:in_memory) || Array.wrap(relation)).each do |doc|
|
29
68
|
doc.save
|
30
69
|
end
|
31
70
|
end
|
71
|
+
exit_autosave
|
32
72
|
end
|
33
73
|
end
|
34
74
|
end
|
75
|
+
|
76
|
+
# Can the autosave be added?
|
77
|
+
#
|
78
|
+
# @example Can the autosave be added?
|
79
|
+
# Person.autosavable?(metadata)
|
80
|
+
#
|
81
|
+
# @param [ Metadata ] metadata The relation metadata.
|
82
|
+
#
|
83
|
+
# @return [ true, false ] If the autosave is able to be added.
|
84
|
+
#
|
85
|
+
# @since 3.0.0
|
86
|
+
def autosavable?(metadata)
|
87
|
+
!autosaved_relations.include?(metadata.name) && !metadata.embedded?
|
88
|
+
end
|
35
89
|
end
|
36
90
|
end
|
37
91
|
end
|