mongoid 2.4.10 → 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 +949 -10
- data/LICENSE +1 -1
- data/README.md +10 -11
- data/Rakefile +3 -17
- data/lib/config/locales/en.yml +455 -51
- data/lib/mongoid/atomic/modifiers.rb +2 -2
- 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/embedded.rb +4 -5
- data/lib/mongoid/atomic/paths/root.rb +4 -5
- data/lib/mongoid/atomic.rb +70 -16
- data/lib/mongoid/attributes/processing.rb +14 -10
- data/lib/mongoid/attributes/readonly.rb +56 -0
- data/lib/mongoid/attributes.rb +95 -32
- data/lib/mongoid/callbacks.rb +106 -43
- data/lib/mongoid/components.rb +12 -23
- data/lib/mongoid/config/environment.rb +7 -4
- data/lib/mongoid/config/inflections.rb +6 -0
- data/lib/mongoid/config/options.rb +1 -1
- data/lib/mongoid/config/validators/option.rb +25 -0
- data/lib/mongoid/config/validators/session.rb +140 -0
- data/lib/mongoid/config/validators.rb +3 -0
- data/lib/mongoid/config.rb +104 -225
- data/lib/mongoid/contextual/aggregable/memory.rb +109 -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 +68 -0
- data/lib/mongoid/contextual/map_reduce.rb +273 -0
- data/lib/mongoid/contextual/memory.rb +406 -0
- data/lib/mongoid/contextual/mongo.rb +662 -0
- data/lib/mongoid/contextual.rb +50 -0
- data/lib/mongoid/copyable.rb +7 -25
- data/lib/mongoid/criteria.rb +515 -245
- 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 +71 -52
- 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_metadata.rb +21 -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/errors.rb +23 -1
- data/lib/mongoid/evolvable.rb +19 -0
- data/lib/mongoid/extensions/array.rb +164 -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 +73 -0
- data/lib/mongoid/extensions/false_class.rb +38 -0
- data/lib/mongoid/extensions/float.rb +56 -0
- data/lib/mongoid/extensions/hash.rb +123 -0
- data/lib/mongoid/extensions/integer.rb +66 -0
- data/lib/mongoid/extensions/module.rb +28 -0
- data/lib/mongoid/extensions/nil_class.rb +21 -0
- data/lib/mongoid/extensions/object.rb +238 -0
- data/lib/mongoid/extensions/object_id.rb +54 -0
- data/lib/mongoid/extensions/range.rb +79 -0
- data/lib/mongoid/extensions/regexp.rb +27 -0
- data/lib/mongoid/extensions/set.rb +55 -0
- data/lib/mongoid/extensions/string.rb +181 -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 +38 -0
- data/lib/mongoid/extensions.rb +28 -76
- data/lib/mongoid/factory.rb +1 -1
- data/lib/mongoid/fields/foreign_key.rb +150 -0
- data/lib/mongoid/fields/localized.rb +73 -0
- data/lib/mongoid/fields/standard.rb +268 -0
- data/lib/mongoid/fields/validators/macro.rb +83 -0
- data/lib/mongoid/fields/validators.rb +2 -0
- data/lib/mongoid/fields.rb +142 -208
- data/lib/mongoid/finders.rb +45 -50
- data/lib/mongoid/hierarchy.rb +44 -15
- data/lib/mongoid/identity_map.rb +49 -21
- data/lib/mongoid/indexes/validators/options.rb +80 -0
- data/lib/mongoid/indexes.rb +66 -15
- data/lib/mongoid/inspection.rb +1 -1
- data/lib/mongoid/json.rb +2 -2
- data/lib/mongoid/loggable.rb +69 -0
- 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/matchers.rb +1 -1
- data/lib/mongoid/multi_parameter_attributes.rb +9 -11
- data/lib/mongoid/nested_attributes.rb +17 -9
- data/lib/mongoid/observer.rb +1 -2
- data/lib/mongoid/paranoia.rb +10 -44
- 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/atomic.rb +2 -2
- 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/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/persistence/operations/upsert.rb +28 -0
- data/lib/mongoid/persistence/operations.rb +22 -19
- data/lib/mongoid/persistence/upsertion.rb +30 -0
- data/lib/mongoid/persistence.rb +94 -39
- data/lib/mongoid/railtie.rb +26 -11
- data/lib/mongoid/railties/database.rake +22 -108
- data/lib/mongoid/relations/accessors.rb +120 -20
- 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 +4 -4
- 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 +5 -5
- data/lib/mongoid/relations/builders/referenced/in.rb +4 -4
- data/lib/mongoid/relations/builders/referenced/many.rb +6 -6
- 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/builders.rb +19 -16
- 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/cascading.rb +10 -7
- data/lib/mongoid/relations/constraint.rb +4 -3
- data/lib/mongoid/relations/conversions.rb +6 -7
- data/lib/mongoid/relations/cyclic.rb +7 -7
- data/lib/mongoid/relations/embedded/batchable.rb +347 -0
- data/lib/mongoid/relations/embedded/in.rb +23 -12
- data/lib/mongoid/relations/embedded/many.rb +100 -161
- data/lib/mongoid/relations/embedded/one.rb +25 -14
- data/lib/mongoid/relations/macros.rb +105 -60
- data/lib/mongoid/relations/many.rb +93 -14
- data/lib/mongoid/relations/metadata.rb +277 -47
- data/lib/mongoid/relations/nested_builder.rb +4 -6
- 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 +62 -31
- data/lib/mongoid/relations/referenced/in.rb +40 -15
- data/lib/mongoid/relations/referenced/many.rb +162 -130
- data/lib/mongoid/relations/referenced/many_to_many.rb +104 -48
- 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/relations/touchable.rb +32 -0
- data/lib/mongoid/relations.rb +22 -6
- data/lib/mongoid/reloading.rb +12 -14
- data/lib/mongoid/scoping.rb +312 -0
- data/lib/mongoid/serialization.rb +94 -42
- data/lib/mongoid/sessions/factory.rb +108 -0
- data/lib/mongoid/sessions/mongo_uri.rb +93 -0
- data/lib/mongoid/sessions/validators/storage.rb +49 -0
- data/lib/mongoid/sessions/validators.rb +2 -0
- data/lib/mongoid/sessions.rb +383 -0
- data/lib/mongoid/sharding.rb +6 -6
- data/lib/mongoid/state.rb +6 -7
- data/lib/mongoid/threaded/lifecycle.rb +21 -21
- data/lib/mongoid/threaded/sessions.rb +0 -0
- data/lib/mongoid/threaded.rb +219 -59
- data/lib/mongoid/timestamps/created.rb +8 -4
- data/lib/mongoid/timestamps/timeless.rb +6 -4
- data/lib/mongoid/timestamps/updated.rb +4 -3
- data/lib/mongoid/timestamps.rb +1 -1
- data/lib/mongoid/unit_of_work.rb +61 -0
- data/lib/mongoid/validations/associated.rb +2 -2
- data/lib/mongoid/validations/format.rb +2 -2
- data/lib/mongoid/validations/presence.rb +34 -4
- data/lib/mongoid/validations/uniqueness.rb +11 -12
- data/lib/mongoid/validations.rb +28 -20
- data/lib/mongoid/version.rb +2 -2
- data/lib/mongoid/versioning.rb +25 -26
- data/lib/mongoid.rb +37 -37
- 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 +65 -17
- 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 +73 -26
- metadata +103 -148
- 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/master.rb +0 -45
- data/lib/mongoid/collections/operations.rb +0 -44
- data/lib/mongoid/collections/retry.rb +0 -59
- data/lib/mongoid/collections.rb +0 -120
- data/lib/mongoid/config/database.rb +0 -181
- data/lib/mongoid/config/replset_database.rb +0 -80
- data/lib/mongoid/contexts/enumerable/sort.rb +0 -43
- data/lib/mongoid/contexts/enumerable.rb +0 -313
- data/lib/mongoid/contexts/mongo.rb +0 -487
- data/lib/mongoid/contexts.rb +0 -25
- 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 -108
- 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 -76
- 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/javascript/functions.yml +0 -63
- data/lib/mongoid/javascript.rb +0 -20
- 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/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/embedded/atomic.rb +0 -89
- data/lib/mongoid/relations/referenced/batch/insert.rb +0 -57
- data/lib/mongoid/relations/referenced/batch.rb +0 -73
- 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
|
|
@@ -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,17 +12,17 @@ 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
|
-
# @param [ Hash, BSON::ObjectId ] object The id or attributes to use.
|
|
18
|
+
# @param [ Hash, Moped::BSON::ObjectId ] object The id or attributes to use.
|
|
19
19
|
# @param [ Metadata ] metadata The relation's metadata.
|
|
20
20
|
# @param [ true, false ] building If we are in a build operation.
|
|
21
21
|
#
|
|
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
|
|
@@ -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
|
# Superclass for all objects that bind relations together.
|
|
6
6
|
class Binding
|
|
@@ -21,6 +21,215 @@ module Mongoid # :nodoc:
|
|
|
21
21
|
def initialize(base, target, metadata)
|
|
22
22
|
@base, @target, @metadata = base, target, metadata
|
|
23
23
|
end
|
|
24
|
+
|
|
25
|
+
# Execute the provided block inside a binding.
|
|
26
|
+
#
|
|
27
|
+
# @example Execute the binding block.
|
|
28
|
+
# binding.binding do
|
|
29
|
+
# base.foreign_key = 1
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# @return [ Object ] The result of the yield.
|
|
33
|
+
#
|
|
34
|
+
# @since 3.0.0
|
|
35
|
+
def binding
|
|
36
|
+
unless _binding?
|
|
37
|
+
_binding do
|
|
38
|
+
yield(self) if block_given?
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
|
|
45
|
+
# Check if the inverse is properly defined.
|
|
46
|
+
#
|
|
47
|
+
# @api private
|
|
48
|
+
#
|
|
49
|
+
# @example Check the inverse definition.
|
|
50
|
+
# binding.check_inverse!(doc)
|
|
51
|
+
#
|
|
52
|
+
# @param [ Document ] doc The document getting bound.
|
|
53
|
+
#
|
|
54
|
+
# @raise [ Errors::InverseNotFound ] If no inverse found.
|
|
55
|
+
#
|
|
56
|
+
# @since 3.0.0
|
|
57
|
+
def check_inverse!(doc)
|
|
58
|
+
if !metadata.forced_nil_inverse? &&
|
|
59
|
+
!doc.respond_to?(metadata.foreign_key_setter)
|
|
60
|
+
raise Errors::InverseNotFound.new(
|
|
61
|
+
base.class,
|
|
62
|
+
metadata.name,
|
|
63
|
+
doc.class,
|
|
64
|
+
metadata.foreign_key
|
|
65
|
+
)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Check for problems with multiple inverse definitions.
|
|
70
|
+
#
|
|
71
|
+
# @api private
|
|
72
|
+
#
|
|
73
|
+
# @example Check for inverses errors.
|
|
74
|
+
# binding.check_inverses!(doc)
|
|
75
|
+
#
|
|
76
|
+
# @param [ Document ] doc The document to check.
|
|
77
|
+
#
|
|
78
|
+
# @since 3.0.0
|
|
79
|
+
def check_inverses!(doc)
|
|
80
|
+
inverses = metadata.inverses(doc)
|
|
81
|
+
if inverses.count > 1 && base.send(metadata.foreign_key).nil?
|
|
82
|
+
raise Errors::InvalidSetPolymorphicRelation.new(
|
|
83
|
+
metadata.name, base.class.name, target.class.name
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Set the id of the related document in the foreign key field on the
|
|
89
|
+
# keyed document.
|
|
90
|
+
#
|
|
91
|
+
# @api private
|
|
92
|
+
#
|
|
93
|
+
# @example Bind the foreign key.
|
|
94
|
+
# binding.bind_foreign_key(post, person.id)
|
|
95
|
+
#
|
|
96
|
+
# @param [ Document ] keyed The document that stores the foreign key.
|
|
97
|
+
# @param [ Object ] id The id of the bound document.
|
|
98
|
+
#
|
|
99
|
+
# @since 3.0.0
|
|
100
|
+
def bind_foreign_key(keyed, id)
|
|
101
|
+
unless keyed.frozen?
|
|
102
|
+
keyed.you_must(metadata.foreign_key_setter, id)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Set the type of the related document on the foreign type field, used
|
|
107
|
+
# when relations are polymorphic.
|
|
108
|
+
#
|
|
109
|
+
# @api private
|
|
110
|
+
#
|
|
111
|
+
# @example Bind the polymorphic type.
|
|
112
|
+
# binding.bind_polymorphic_type(post, "Person")
|
|
113
|
+
#
|
|
114
|
+
# @param [ Document ] typed The document that stores the type field.
|
|
115
|
+
# @param [ String ] name The name of the model.
|
|
116
|
+
#
|
|
117
|
+
# @since 3.0.0
|
|
118
|
+
def bind_polymorphic_type(typed, name)
|
|
119
|
+
if metadata.type
|
|
120
|
+
typed.you_must(metadata.type_setter, name)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Set the type of the related document on the foreign type field, used
|
|
125
|
+
# when relations are polymorphic.
|
|
126
|
+
#
|
|
127
|
+
# @api private
|
|
128
|
+
#
|
|
129
|
+
# @example Bind the polymorphic type.
|
|
130
|
+
# binding.bind_polymorphic_inverse_type(post, "Person")
|
|
131
|
+
#
|
|
132
|
+
# @param [ Document ] typed The document that stores the type field.
|
|
133
|
+
# @param [ String ] name The name of the model.
|
|
134
|
+
#
|
|
135
|
+
# @since 3.0.0
|
|
136
|
+
def bind_polymorphic_inverse_type(typed, name)
|
|
137
|
+
if metadata.inverse_type
|
|
138
|
+
typed.you_must(metadata.inverse_type_setter, name)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Bind the inverse document to the child document so that the in memory
|
|
143
|
+
# instances are the same.
|
|
144
|
+
#
|
|
145
|
+
# @api private
|
|
146
|
+
#
|
|
147
|
+
# @example Bind the inverse.
|
|
148
|
+
# binding.bind_inverse(post, person)
|
|
149
|
+
#
|
|
150
|
+
# @param [ Document ] doc The base document.
|
|
151
|
+
# @param [ Document ] inverse The inverse document.
|
|
152
|
+
#
|
|
153
|
+
# @since 3.0.0
|
|
154
|
+
def bind_inverse(doc, inverse)
|
|
155
|
+
if doc.respond_to?(metadata.inverse_setter)
|
|
156
|
+
doc.you_must(metadata.inverse_setter, inverse)
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Bind the inverse of field, when in a polymorphic relation.
|
|
161
|
+
#
|
|
162
|
+
# @api private
|
|
163
|
+
#
|
|
164
|
+
# @example Bind the inverse of field.
|
|
165
|
+
# binding.bind_inverse_of_field(doc)
|
|
166
|
+
#
|
|
167
|
+
# @param [ Document ] doc The document to bind.
|
|
168
|
+
# @param [ String ] name The name of the relation.
|
|
169
|
+
#
|
|
170
|
+
# @since 3.0.0
|
|
171
|
+
def bind_inverse_of_field(doc, name)
|
|
172
|
+
if inverse_metadata = metadata.inverse_metadata(doc)
|
|
173
|
+
if setter = inverse_metadata.inverse_of_field_setter
|
|
174
|
+
doc.you_must(setter, name)
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Bind the provided document with the base from the parent relation.
|
|
180
|
+
#
|
|
181
|
+
# @api private
|
|
182
|
+
#
|
|
183
|
+
# @example Bind the document with the base.
|
|
184
|
+
# binding.bind_from_relational_parent(doc)
|
|
185
|
+
#
|
|
186
|
+
# @param [ Document ] doc The document to bind.
|
|
187
|
+
#
|
|
188
|
+
# @since 3.0.0
|
|
189
|
+
def bind_from_relational_parent(doc)
|
|
190
|
+
check_inverse!(doc)
|
|
191
|
+
bind_foreign_key(doc, base.id)
|
|
192
|
+
bind_polymorphic_type(doc, base.class.model_name)
|
|
193
|
+
bind_inverse(doc, base)
|
|
194
|
+
bind_inverse_of_field(doc, metadata.name)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# Ensure that the metadata on the base is correct, for the cases
|
|
198
|
+
# where we have multiple belongs to definitions and were are setting
|
|
199
|
+
# different parents in memory in order.
|
|
200
|
+
#
|
|
201
|
+
# @api private
|
|
202
|
+
#
|
|
203
|
+
# @example Set the base metadata.
|
|
204
|
+
# binding.set_base_metadata
|
|
205
|
+
#
|
|
206
|
+
# @return [ true, false ] If the metadata changed.
|
|
207
|
+
#
|
|
208
|
+
# @since 2.4.4
|
|
209
|
+
def set_base_metadata
|
|
210
|
+
inverse_metadata = metadata.inverse_metadata(target)
|
|
211
|
+
if inverse_metadata != metadata && !inverse_metadata.nil?
|
|
212
|
+
base.metadata = inverse_metadata
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
# Bind the provided document with the base from the parent relation.
|
|
217
|
+
#
|
|
218
|
+
# @api private
|
|
219
|
+
#
|
|
220
|
+
# @example Bind the document with the base.
|
|
221
|
+
# unbinding.unbind_from_relational_parent(doc)
|
|
222
|
+
#
|
|
223
|
+
# @param [ Document ] doc The document to unbind.
|
|
224
|
+
#
|
|
225
|
+
# @since 3.0.0
|
|
226
|
+
def unbind_from_relational_parent(doc)
|
|
227
|
+
check_inverse!(doc)
|
|
228
|
+
bind_foreign_key(doc, nil)
|
|
229
|
+
bind_polymorphic_type(doc, nil)
|
|
230
|
+
bind_inverse(doc, nil)
|
|
231
|
+
bind_inverse_of_field(doc, nil)
|
|
232
|
+
end
|
|
24
233
|
end
|
|
25
234
|
end
|
|
26
235
|
end
|