mongoid 7.6.2 → 8.0.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +2 -0
- data/README.md +3 -3
- data/Rakefile +21 -85
- data/lib/config/locales/en.yml +46 -56
- data/lib/mongoid/association/accessors.rb +32 -3
- data/lib/mongoid/association/bindable.rb +48 -0
- data/lib/mongoid/association/builders.rb +4 -2
- data/lib/mongoid/association/depending.rb +4 -8
- data/lib/mongoid/association/eager_loadable.rb +29 -7
- data/lib/mongoid/association/embedded/batchable.rb +28 -5
- data/lib/mongoid/association/embedded/embedded_in/binding.rb +24 -2
- data/lib/mongoid/association/embedded/embedded_in.rb +2 -1
- data/lib/mongoid/association/embedded/embeds_many/binding.rb +1 -0
- data/lib/mongoid/association/embedded/embeds_many/buildable.rb +1 -1
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +40 -18
- data/lib/mongoid/association/embedded/embeds_one/buildable.rb +18 -4
- data/lib/mongoid/association/embedded/embeds_one/proxy.rb +21 -2
- data/lib/mongoid/association/macros.rb +2 -1
- data/lib/mongoid/association/many.rb +5 -0
- data/lib/mongoid/association/nested/many.rb +5 -39
- data/lib/mongoid/association/nested/nested_buildable.rb +0 -14
- data/lib/mongoid/association/proxy.rb +12 -0
- data/lib/mongoid/association/referenced/auto_save.rb +3 -2
- data/lib/mongoid/association/referenced/belongs_to/binding.rb +1 -0
- data/lib/mongoid/association/referenced/belongs_to/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/belongs_to.rb +1 -1
- data/lib/mongoid/association/referenced/counter_cache.rb +8 -8
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +64 -11
- data/lib/mongoid/association/referenced/has_and_belongs_to_many.rb +4 -1
- data/lib/mongoid/association/referenced/has_many/enumerable.rb +10 -18
- data/lib/mongoid/association/referenced/has_many/proxy.rb +11 -107
- data/lib/mongoid/association/referenced/has_one/buildable.rb +1 -1
- data/lib/mongoid/association/referenced/has_one/proxy.rb +8 -11
- data/lib/mongoid/association/referenced/syncable.rb +2 -2
- data/lib/mongoid/association/relatable.rb +38 -4
- data/lib/mongoid/attributes/processing.rb +9 -2
- data/lib/mongoid/attributes.rb +30 -27
- data/lib/mongoid/cacheable.rb +2 -2
- data/lib/mongoid/changeable.rb +37 -2
- data/lib/mongoid/clients/factory.rb +0 -4
- data/lib/mongoid/clients/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config.rb +15 -73
- data/lib/mongoid/contextual/aggregable/memory.rb +22 -20
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +63 -47
- data/lib/mongoid/contextual/mongo.rb +173 -287
- data/lib/mongoid/contextual/none.rb +33 -15
- data/lib/mongoid/copyable.rb +32 -8
- data/lib/mongoid/criteria/includable.rb +24 -20
- data/lib/mongoid/criteria/marshalable.rb +10 -2
- data/lib/mongoid/criteria/queryable/extensions/array.rb +2 -15
- data/lib/mongoid/criteria/queryable/extensions/big_decimal.rb +25 -4
- data/lib/mongoid/criteria/queryable/extensions/boolean.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/date.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/date_time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +0 -16
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/object.rb +2 -1
- data/lib/mongoid/criteria/queryable/extensions/range.rb +13 -5
- data/lib/mongoid/criteria/queryable/extensions/regexp.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +3 -1
- data/lib/mongoid/criteria/queryable/extensions/time.rb +6 -1
- data/lib/mongoid/criteria/queryable/extensions/time_with_zone.rb +6 -1
- data/lib/mongoid/criteria/queryable/mergeable.rb +0 -12
- data/lib/mongoid/criteria/queryable/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +2 -133
- data/lib/mongoid/criteria/queryable/selector.rb +90 -5
- data/lib/mongoid/criteria/queryable/smash.rb +39 -6
- data/lib/mongoid/criteria/queryable/storable.rb +1 -1
- data/lib/mongoid/criteria/queryable.rb +11 -6
- data/lib/mongoid/criteria.rb +1 -28
- data/lib/mongoid/deprecable.rb +36 -0
- data/lib/mongoid/deprecation.rb +25 -0
- data/lib/mongoid/document.rb +88 -33
- data/lib/mongoid/equality.rb +4 -4
- data/lib/mongoid/errors/document_not_found.rb +6 -2
- data/lib/mongoid/errors/invalid_dot_dollar_assignment.rb +23 -0
- data/lib/mongoid/errors/invalid_field.rb +5 -1
- data/lib/mongoid/errors/invalid_field_type.rb +26 -0
- data/lib/mongoid/errors/too_many_nested_attribute_records.rb +1 -1
- data/lib/mongoid/errors.rb +2 -3
- data/lib/mongoid/extensions/array.rb +8 -6
- data/lib/mongoid/extensions/big_decimal.rb +29 -10
- data/lib/mongoid/extensions/binary.rb +42 -0
- data/lib/mongoid/extensions/boolean.rb +8 -2
- data/lib/mongoid/extensions/date.rb +26 -20
- data/lib/mongoid/extensions/date_time.rb +1 -1
- data/lib/mongoid/extensions/float.rb +4 -5
- data/lib/mongoid/extensions/hash.rb +13 -32
- data/lib/mongoid/extensions/integer.rb +4 -5
- data/lib/mongoid/extensions/object.rb +2 -0
- data/lib/mongoid/extensions/range.rb +41 -10
- data/lib/mongoid/extensions/regexp.rb +11 -4
- data/lib/mongoid/extensions/set.rb +11 -4
- data/lib/mongoid/extensions/string.rb +2 -13
- data/lib/mongoid/extensions/symbol.rb +3 -14
- data/lib/mongoid/extensions/time.rb +27 -16
- data/lib/mongoid/extensions/time_with_zone.rb +1 -2
- data/lib/mongoid/extensions.rb +1 -0
- data/lib/mongoid/factory.rb +42 -7
- data/lib/mongoid/fields/foreign_key.rb +7 -0
- data/lib/mongoid/fields/validators/macro.rb +3 -9
- data/lib/mongoid/fields.rb +49 -7
- data/lib/mongoid/findable.rb +21 -16
- data/lib/mongoid/indexable/specification.rb +1 -1
- data/lib/mongoid/indexable/validators/options.rb +4 -1
- data/lib/mongoid/interceptable.rb +69 -9
- data/lib/mongoid/matchable.rb +1 -6
- data/lib/mongoid/matcher/eq_impl_with_regexp.rb +5 -3
- data/lib/mongoid/matcher/regex.rb +9 -8
- data/lib/mongoid/matcher.rb +0 -1
- data/lib/mongoid/persistable/creatable.rb +14 -5
- data/lib/mongoid/persistable/updatable.rb +12 -5
- data/lib/mongoid/persistence_context.rb +8 -42
- data/lib/mongoid/query_cache.rb +6 -258
- data/lib/mongoid/railties/controller_runtime.rb +1 -1
- data/lib/mongoid/reloadable.rb +7 -3
- data/lib/mongoid/scopable.rb +9 -11
- data/lib/mongoid/selectable.rb +1 -2
- data/lib/mongoid/shardable.rb +11 -35
- data/lib/mongoid/stateful.rb +27 -1
- data/lib/mongoid/threaded.rb +0 -3
- data/lib/mongoid/timestamps/created.rb +1 -1
- data/lib/mongoid/timestamps/updated.rb +1 -1
- data/lib/mongoid/touchable.rb +2 -3
- data/lib/mongoid/traversable.rb +1 -0
- data/lib/mongoid/validatable/uniqueness.rb +2 -1
- data/lib/mongoid/version.rb +1 -5
- data/lib/mongoid/warnings.rb +3 -5
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -20
- data/spec/integration/associations/belongs_to_spec.rb +18 -0
- data/spec/integration/associations/embedded_spec.rb +15 -0
- data/spec/integration/associations/embeds_many_spec.rb +15 -2
- data/spec/integration/associations/embeds_one_spec.rb +18 -0
- data/spec/integration/associations/foreign_key_spec.rb +9 -0
- data/spec/integration/associations/has_and_belongs_to_many_spec.rb +21 -0
- data/spec/integration/associations/has_one_spec.rb +97 -1
- data/spec/integration/associations/scope_option_spec.rb +1 -1
- data/spec/integration/callbacks_models.rb +95 -1
- data/spec/integration/callbacks_spec.rb +226 -4
- data/spec/integration/criteria/range_spec.rb +95 -1
- data/spec/integration/discriminator_key_spec.rb +115 -76
- data/spec/integration/dots_and_dollars_spec.rb +277 -0
- data/spec/integration/i18n_fallbacks_spec.rb +1 -15
- data/spec/integration/matcher_examples_spec.rb +20 -13
- data/spec/integration/matcher_operator_data/regex.yml +0 -21
- data/spec/integration/matcher_operator_data/type_decimal.yml +3 -2
- data/spec/integration/matcher_operator_spec.rb +3 -5
- data/spec/integration/persistence/range_field_spec.rb +350 -0
- data/spec/mongoid/association/counter_cache_spec.rb +1 -1
- data/spec/mongoid/association/depending_spec.rb +9 -9
- data/spec/mongoid/association/eager_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/binding_spec.rb +2 -1
- data/spec/mongoid/association/embedded/embedded_in/buildable_spec.rb +54 -0
- data/spec/mongoid/association/embedded/embedded_in/proxy_spec.rb +69 -9
- data/spec/mongoid/association/embedded/embeds_many/buildable_spec.rb +112 -0
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +198 -8
- data/spec/mongoid/association/embedded/embeds_many_models.rb +36 -0
- data/spec/mongoid/association/embedded/embeds_many_query_spec.rb +12 -0
- data/spec/mongoid/association/embedded/embeds_many_spec.rb +68 -0
- data/spec/mongoid/association/embedded/embeds_one/buildable_spec.rb +25 -0
- data/spec/mongoid/association/embedded/embeds_one_models.rb +19 -0
- data/spec/mongoid/association/embedded/embeds_one_spec.rb +28 -0
- data/spec/mongoid/association/referenced/belongs_to/binding_spec.rb +2 -1
- data/spec/mongoid/association/referenced/belongs_to/buildable_spec.rb +54 -0
- data/spec/mongoid/association/referenced/belongs_to/proxy_spec.rb +15 -0
- data/spec/mongoid/association/referenced/belongs_to_models.rb +11 -0
- data/spec/mongoid/association/referenced/belongs_to_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +36 -51
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_models.rb +25 -0
- data/spec/mongoid/association/referenced/has_and_belongs_to_many_spec.rb +35 -2
- data/spec/mongoid/association/referenced/has_many/buildable_spec.rb +109 -0
- data/spec/mongoid/association/referenced/has_many/enumerable_spec.rb +2 -56
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +60 -156
- data/spec/mongoid/association/referenced/has_many_models.rb +3 -1
- data/spec/mongoid/association/referenced/has_many_spec.rb +25 -0
- data/spec/mongoid/association/referenced/has_one/buildable_spec.rb +2 -2
- data/spec/mongoid/association/referenced/has_one/proxy_spec.rb +107 -1
- data/spec/mongoid/association/referenced/has_one_models.rb +16 -0
- data/spec/mongoid/association/syncable_spec.rb +14 -0
- data/spec/mongoid/atomic/paths_spec.rb +0 -14
- data/spec/mongoid/attributes/nested_spec.rb +73 -198
- data/spec/mongoid/attributes/nested_spec_models.rb +48 -0
- data/spec/mongoid/attributes/projector_spec.rb +1 -5
- data/spec/mongoid/attributes_spec.rb +480 -27
- data/spec/mongoid/cacheable_spec.rb +3 -3
- data/spec/mongoid/changeable_spec.rb +130 -13
- data/spec/mongoid/clients/factory_spec.rb +22 -60
- data/spec/mongoid/clients/sessions_spec.rb +0 -38
- data/spec/mongoid/clients_spec.rb +2 -2
- data/spec/mongoid/config_spec.rb +52 -15
- data/spec/mongoid/contextual/aggregable/memory_spec.rb +371 -231
- data/spec/mongoid/contextual/aggregable/memory_table.yml +88 -0
- data/spec/mongoid/contextual/aggregable/memory_table_spec.rb +62 -0
- data/spec/mongoid/contextual/map_reduce_spec.rb +2 -16
- data/spec/mongoid/contextual/memory_spec.rb +467 -156
- data/spec/mongoid/contextual/mongo_spec.rb +566 -426
- data/spec/mongoid/contextual/none_spec.rb +11 -19
- data/spec/mongoid/copyable_spec.rb +451 -2
- data/spec/mongoid/criteria/findable_spec.rb +86 -210
- data/spec/mongoid/criteria/includable_spec.rb +1492 -0
- data/spec/mongoid/criteria/includable_spec_models.rb +54 -0
- data/spec/mongoid/criteria/marshalable_spec.rb +18 -1
- data/spec/mongoid/criteria/queryable/extensions/array_spec.rb +7 -19
- data/spec/mongoid/criteria/queryable/extensions/big_decimal_spec.rb +134 -26
- data/spec/mongoid/criteria/queryable/extensions/bignum_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/date_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/date_time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/fixnum_spec.rb +1 -2
- data/spec/mongoid/criteria/queryable/extensions/hash_spec.rb +0 -15
- data/spec/mongoid/criteria/queryable/extensions/numeric_spec.rb +73 -7
- data/spec/mongoid/criteria/queryable/extensions/time_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/extensions/time_with_zone_spec.rb +11 -0
- data/spec/mongoid/criteria/queryable/optional_spec.rb +0 -484
- data/spec/mongoid/criteria/queryable/selectable_logical_spec.rb +50 -2
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- data/spec/mongoid/criteria/queryable/selectable_where_spec.rb +0 -200
- data/spec/mongoid/criteria/queryable/selector_spec.rb +16 -77
- data/spec/mongoid/criteria/queryable/storable_spec.rb +0 -72
- data/spec/mongoid/criteria_spec.rb +469 -1203
- data/spec/mongoid/document_fields_spec.rb +173 -24
- data/spec/mongoid/document_spec.rb +32 -41
- data/spec/mongoid/equality_spec.rb +12 -12
- data/spec/mongoid/errors/document_not_found_spec.rb +29 -2
- data/spec/mongoid/errors/invalid_field_spec.rb +1 -1
- data/spec/mongoid/errors/invalid_field_type_spec.rb +55 -0
- data/spec/mongoid/errors/mongoid_error_spec.rb +3 -1
- data/spec/mongoid/errors/no_environment_spec.rb +3 -3
- data/spec/mongoid/errors/too_many_nested_attribute_records_spec.rb +1 -1
- data/spec/mongoid/extensions/array_spec.rb +16 -2
- data/spec/mongoid/extensions/big_decimal_spec.rb +697 -212
- data/spec/mongoid/extensions/binary_spec.rb +44 -9
- data/spec/mongoid/extensions/boolean_spec.rb +68 -82
- data/spec/mongoid/extensions/date_class_mongoize_spec.rb +7 -3
- data/spec/mongoid/extensions/date_spec.rb +71 -1
- data/spec/mongoid/extensions/date_time_spec.rb +15 -9
- data/spec/mongoid/extensions/float_spec.rb +48 -76
- data/spec/mongoid/extensions/hash_spec.rb +30 -236
- data/spec/mongoid/extensions/integer_spec.rb +45 -66
- data/spec/mongoid/extensions/range_spec.rb +255 -54
- data/spec/mongoid/extensions/regexp_spec.rb +58 -33
- data/spec/mongoid/extensions/set_spec.rb +106 -0
- data/spec/mongoid/extensions/string_spec.rb +53 -25
- data/spec/mongoid/extensions/symbol_spec.rb +18 -25
- data/spec/mongoid/extensions/time_spec.rb +634 -66
- data/spec/mongoid/extensions/time_with_zone_spec.rb +17 -31
- data/spec/mongoid/factory_spec.rb +61 -1
- data/spec/mongoid/fields_spec.rb +321 -50
- data/spec/mongoid/findable_spec.rb +64 -29
- data/spec/mongoid/indexable/specification_spec.rb +2 -2
- data/spec/mongoid/indexable_spec.rb +16 -19
- data/spec/mongoid/interceptable_spec.rb +584 -5
- data/spec/mongoid/interceptable_spec_models.rb +235 -4
- data/spec/mongoid/matcher/extract_attribute_spec.rb +1 -5
- data/spec/mongoid/mongoizable_spec.rb +285 -0
- data/spec/mongoid/persistable/creatable_spec.rb +2 -2
- data/spec/mongoid/persistable/deletable_spec.rb +2 -2
- data/spec/mongoid/persistable/destroyable_spec.rb +2 -2
- data/spec/mongoid/persistable/upsertable_spec.rb +14 -0
- data/spec/mongoid/persistence_context_spec.rb +24 -0
- data/spec/mongoid/query_cache_middleware_spec.rb +0 -18
- data/spec/mongoid/query_cache_spec.rb +1 -156
- data/spec/mongoid/reloadable_spec.rb +35 -2
- data/spec/mongoid/scopable_spec.rb +36 -34
- data/spec/mongoid/serializable_spec.rb +14 -7
- data/spec/mongoid/shardable_models.rb +0 -14
- data/spec/mongoid/shardable_spec.rb +61 -153
- data/spec/mongoid/stateful_spec.rb +28 -0
- data/spec/mongoid/timestamps_spec.rb +390 -0
- data/spec/mongoid/timestamps_spec_models.rb +67 -0
- data/spec/mongoid/touchable_spec.rb +116 -0
- data/spec/mongoid/touchable_spec_models.rb +12 -8
- data/spec/mongoid/traversable_spec.rb +4 -11
- data/spec/mongoid/validatable/presence_spec.rb +1 -1
- data/spec/mongoid/validatable/uniqueness_spec.rb +60 -31
- data/spec/mongoid/warnings_spec.rb +35 -0
- data/spec/mongoid_spec.rb +1 -7
- data/spec/rails/controller_extension/controller_runtime_spec.rb +2 -2
- data/spec/rails/mongoid_spec.rb +4 -16
- data/spec/shared/lib/mrss/cluster_config.rb +40 -5
- data/spec/shared/lib/mrss/constraints.rb +46 -7
- data/spec/shared/lib/mrss/docker_runner.rb +21 -17
- data/spec/shared/lib/mrss/eg_config_utils.rb +31 -0
- data/spec/shared/lib/mrss/event_subscriber.rb +5 -15
- data/spec/shared/lib/mrss/lite_constraints.rb +2 -10
- data/spec/shared/lib/mrss/server_version_registry.rb +29 -18
- data/spec/shared/lib/mrss/spec_organizer.rb +3 -32
- data/spec/shared/lib/mrss/utils.rb +6 -28
- data/spec/shared/share/Dockerfile.erb +114 -38
- data/spec/shared/shlib/distro.sh +0 -10
- data/spec/shared/shlib/server.sh +83 -64
- data/spec/shared/shlib/set_env.sh +81 -16
- data/spec/support/constraints.rb +24 -0
- data/spec/support/expectations.rb +17 -20
- data/spec/support/macros.rb +30 -0
- data/spec/support/models/augmentation.rb +12 -0
- data/spec/support/models/band.rb +3 -0
- data/spec/support/models/catalog.rb +24 -0
- data/spec/support/models/circus.rb +3 -0
- data/spec/support/models/fanatic.rb +8 -0
- data/spec/support/models/implant.rb +9 -0
- data/spec/support/models/label.rb +2 -0
- data/spec/support/models/passport.rb +9 -0
- data/spec/support/models/person.rb +1 -0
- data/spec/support/models/player.rb +2 -0
- data/spec/support/models/powerup.rb +12 -0
- data/spec/support/models/registry.rb +1 -0
- data/spec/support/models/school.rb +14 -0
- data/spec/support/models/shield.rb +18 -0
- data/spec/support/models/student.rb +14 -0
- data/spec/support/models/weapon.rb +12 -0
- data.tar.gz.sig +0 -0
- metadata +695 -650
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/in_memory_regexp_timeout.rb +0 -26
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/lib/mongoid/field_readable.rb +0 -70
- data/lib/mongoid/matcher/regexp_budget.rb +0 -389
- data/spec/integration/matcher_regexp_timeout_spec.rb +0 -215
- data/spec/integration/query_operator_guard_spec.rb +0 -89
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/mongoid/matcher/regexp_budget_spec.rb +0 -570
- data/spec/shared/CANDIDATE.md +0 -28
- data/spec/shared/lib/mrss/release/candidate.rb +0 -287
- data/spec/shared/lib/mrss/release/product_data.rb +0 -144
- data/spec/shared/lib/tasks/candidate.rake +0 -64
|
@@ -2239,10 +2239,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2239
2239
|
Person.create!(username: 'durran')
|
|
2240
2240
|
end
|
|
2241
2241
|
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
person.posts.create!(title: "Test")
|
|
2245
|
-
end
|
|
2242
|
+
let!(:post1) { person.posts.create!(title: "Testing") }
|
|
2243
|
+
let!(:post2) { person.posts.create!(title: "Test") }
|
|
2246
2244
|
|
|
2247
2245
|
it "removes the correct posts" do
|
|
2248
2246
|
person.posts.send(method, { title: "Testing" })
|
|
@@ -2258,6 +2256,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2258
2256
|
it "returns the number of documents deleted" do
|
|
2259
2257
|
expect(person.posts.send(method, { title: "Testing" })).to eq(1)
|
|
2260
2258
|
end
|
|
2259
|
+
|
|
2260
|
+
it "sets the association locally" do
|
|
2261
|
+
person.posts.send(method, { title: "Testing" })
|
|
2262
|
+
expect(person.posts).to eq([post2])
|
|
2263
|
+
end
|
|
2261
2264
|
end
|
|
2262
2265
|
|
|
2263
2266
|
context "when conditions are not provided" do
|
|
@@ -2284,150 +2287,10 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2284
2287
|
it "returns the number of documents deleted" do
|
|
2285
2288
|
expect(person.posts.send(method)).to eq(2)
|
|
2286
2289
|
end
|
|
2287
|
-
end
|
|
2288
|
-
|
|
2289
|
-
context 'when a document is appended with an id that is already loaded' do
|
|
2290
|
-
# Iterating the association moves an appended document out of _added
|
|
2291
|
-
# without adding it to _loaded, so the scan for matches and the
|
|
2292
|
-
# removal that follows see different instances for the same id.
|
|
2293
|
-
let(:person) { Person.create! }
|
|
2294
|
-
let!(:post) { person.posts.create!(title: 'Testing') }
|
|
2295
|
-
let(:reloaded) { Person.find(person._id) }
|
|
2296
|
-
|
|
2297
|
-
before do
|
|
2298
|
-
reloaded.posts.to_a
|
|
2299
|
-
reloaded.posts._target.push(
|
|
2300
|
-
Post.new(_id: post._id, title: 'Testing', person_id: reloaded._id)
|
|
2301
|
-
)
|
|
2302
|
-
end
|
|
2303
|
-
|
|
2304
|
-
shared_examples 'removes the document once' do
|
|
2305
|
-
it 'sets the association locally' do
|
|
2306
|
-
reloaded.posts.send(method, conditions)
|
|
2307
|
-
expect(reloaded.posts).to eq([])
|
|
2308
|
-
end
|
|
2309
|
-
|
|
2310
|
-
it 'deletes the documents from the database' do
|
|
2311
|
-
reloaded.posts.send(method, conditions)
|
|
2312
|
-
expect(Post.count).to eq(0)
|
|
2313
|
-
end
|
|
2314
|
-
end
|
|
2315
|
-
|
|
2316
|
-
context 'when the conditions carry no regular expression' do
|
|
2317
|
-
let(:conditions) { { title: 'Testing' } }
|
|
2318
|
-
|
|
2319
|
-
it_behaves_like 'removes the document once'
|
|
2320
|
-
end
|
|
2321
2290
|
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
it_behaves_like 'removes the document once'
|
|
2326
|
-
end
|
|
2327
|
-
end
|
|
2328
|
-
|
|
2329
|
-
context 'when an appended document disagrees with the loaded one' do
|
|
2330
|
-
# Only the appended instance matches, so the removal has to drop that
|
|
2331
|
-
# id from both _loaded and _added. Removing by id and stopping at the
|
|
2332
|
-
# first hash that has it would take the loaded instance instead and
|
|
2333
|
-
# leave the unbound one behind.
|
|
2334
|
-
let(:person) { Person.create! }
|
|
2335
|
-
let!(:post) { person.posts.create!(title: 'Other') }
|
|
2336
|
-
let(:reloaded) { Person.find(person._id) }
|
|
2337
|
-
|
|
2338
|
-
before do
|
|
2339
|
-
reloaded.posts.to_a
|
|
2340
|
-
reloaded.posts._target.push(
|
|
2341
|
-
Post.new(_id: post._id, title: 'Testing', person_id: reloaded._id)
|
|
2342
|
-
)
|
|
2343
|
-
end
|
|
2344
|
-
|
|
2345
|
-
it 'deletes nothing from the database' do
|
|
2346
|
-
expect(reloaded.posts.send(method, { title: /Testing/ })).to eq(0)
|
|
2347
|
-
expect(Post.where(title: 'Other').count).to eq(1)
|
|
2348
|
-
end
|
|
2349
|
-
|
|
2350
|
-
it 'leaves no unbound document in the association' do
|
|
2351
|
-
reloaded.posts.send(method, { title: /Testing/ })
|
|
2352
|
-
expect(reloaded.posts._target.in_memory.map(&:person_id)).not_to include(nil)
|
|
2353
|
-
end
|
|
2354
|
-
end
|
|
2355
|
-
|
|
2356
|
-
context 'when a nested selector is evaluated while the association loads' do
|
|
2357
|
-
# Loading the association runs find callbacks, and application code in
|
|
2358
|
-
# one of those can evaluate a selector of its own. A scope opened
|
|
2359
|
-
# around the load would mark it as having nothing to bound, and that
|
|
2360
|
-
# suppresses the decision for the nested selector too, leaving any
|
|
2361
|
-
# pattern in it unguarded.
|
|
2362
|
-
config_override :in_memory_regexp_time_limit, 5.0
|
|
2363
|
-
|
|
2364
|
-
let(:person) { Person.create! }
|
|
2365
|
-
let(:reloaded) { Person.find(person._id) }
|
|
2366
|
-
|
|
2367
|
-
before do
|
|
2368
|
-
person.posts.create!(title: 'Testing')
|
|
2369
|
-
person.posts.create!(title: 'Keep')
|
|
2370
|
-
reloaded
|
|
2371
|
-
end
|
|
2372
|
-
|
|
2373
|
-
it 'leaves the nested scope free to establish its own budget' do
|
|
2374
|
-
seen = []
|
|
2375
|
-
allow(Mongoid::Factory).to receive(:from_db).and_wrap_original do |original, *args|
|
|
2376
|
-
Mongoid::Matcher::RegexpBudget.open('title' => /Testing/) do
|
|
2377
|
-
seen << Mongoid::Matcher::RegexpBudget.remaining
|
|
2378
|
-
end
|
|
2379
|
-
original.call(*args)
|
|
2380
|
-
end
|
|
2381
|
-
|
|
2382
|
-
reloaded.posts.send(method, { title: 'Testing' })
|
|
2383
|
-
|
|
2384
|
-
expect(seen).not_to be_empty
|
|
2385
|
-
expect(seen).not_to include(nil)
|
|
2386
|
-
end
|
|
2387
|
-
end
|
|
2388
|
-
|
|
2389
|
-
if method == :delete_all
|
|
2390
|
-
context 'when the association has not been loaded' do
|
|
2391
|
-
let(:person) { Person.create! }
|
|
2392
|
-
let(:reloaded) { Person.find(person._id) }
|
|
2393
|
-
let(:subscriber) { Mrss::EventSubscriber.new }
|
|
2394
|
-
|
|
2395
|
-
before do
|
|
2396
|
-
person.posts.create!(title: 'Testing')
|
|
2397
|
-
person.posts.create!(title: 'Test')
|
|
2398
|
-
reloaded
|
|
2399
|
-
end
|
|
2400
|
-
|
|
2401
|
-
def commands_for(conditions)
|
|
2402
|
-
Person.collection.client.subscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
2403
|
-
reloaded.posts.delete_all(conditions)
|
|
2404
|
-
subscriber.started_events.map(&:command_name)
|
|
2405
|
-
ensure
|
|
2406
|
-
Person.collection.client.unsubscribe(Mongo::Monitoring::COMMAND, subscriber)
|
|
2407
|
-
end
|
|
2408
|
-
|
|
2409
|
-
context 'when the conditions carry no regular expression' do
|
|
2410
|
-
# Nothing to bound, so the scan for matches stays where it was,
|
|
2411
|
-
# after the delete, where the association it loads comes back
|
|
2412
|
-
# empty. Moving it ahead of the delete would transfer the whole
|
|
2413
|
-
# association for an operation that need send nothing over the
|
|
2414
|
-
# wire.
|
|
2415
|
-
it 'deletes before loading the association' do
|
|
2416
|
-
expect(commands_for(nil)).to eq(%w[ delete find ])
|
|
2417
|
-
end
|
|
2418
|
-
end
|
|
2419
|
-
|
|
2420
|
-
context 'when the conditions carry a regular expression' do
|
|
2421
|
-
# The scan has to run under a budget, and before anything is
|
|
2422
|
-
# deleted, so that a budget which runs out leaves the database
|
|
2423
|
-
# untouched. What it scans is what is already in memory: loading
|
|
2424
|
-
# would trade the matching cost the budget exists to bound for an
|
|
2425
|
-
# unbounded amount of memory, since /.*/ is both cheap to supply
|
|
2426
|
-
# and matches every document in the association.
|
|
2427
|
-
it 'deletes without loading the association' do
|
|
2428
|
-
expect(commands_for({ title: /Test/ })).to eq(%w[ delete ])
|
|
2429
|
-
end
|
|
2430
|
-
end
|
|
2291
|
+
it "sets the association locally" do
|
|
2292
|
+
person.posts.send(method)
|
|
2293
|
+
expect(person.posts).to eq([])
|
|
2431
2294
|
end
|
|
2432
2295
|
end
|
|
2433
2296
|
end
|
|
@@ -2440,10 +2303,8 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2440
2303
|
Movie.create!(title: "Bladerunner")
|
|
2441
2304
|
end
|
|
2442
2305
|
|
|
2443
|
-
|
|
2444
|
-
|
|
2445
|
-
movie.ratings.create!(value: 2)
|
|
2446
|
-
end
|
|
2306
|
+
let!(:rating1) { movie.ratings.create!(value: 1) }
|
|
2307
|
+
let!(:rating2) { movie.ratings.create!(value: 2) }
|
|
2447
2308
|
|
|
2448
2309
|
it "removes the correct ratings" do
|
|
2449
2310
|
movie.ratings.send(method, { value: 1 })
|
|
@@ -2458,6 +2319,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2458
2319
|
it "returns the number of documents deleted" do
|
|
2459
2320
|
expect(movie.ratings.send(method, { value: 1 })).to eq(1)
|
|
2460
2321
|
end
|
|
2322
|
+
|
|
2323
|
+
it "sets the association locally" do
|
|
2324
|
+
movie.ratings.send(method, { value: 1 })
|
|
2325
|
+
expect(movie.ratings).to eq([rating2])
|
|
2326
|
+
end
|
|
2461
2327
|
end
|
|
2462
2328
|
|
|
2463
2329
|
context "when conditions are not provided" do
|
|
@@ -2484,6 +2350,11 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2484
2350
|
it "returns the number of documents deleted" do
|
|
2485
2351
|
expect(movie.ratings.send(method)).to eq(2)
|
|
2486
2352
|
end
|
|
2353
|
+
|
|
2354
|
+
it "sets the association locally" do
|
|
2355
|
+
movie.ratings.send(method)
|
|
2356
|
+
expect(movie.ratings).to eq([])
|
|
2357
|
+
end
|
|
2487
2358
|
end
|
|
2488
2359
|
end
|
|
2489
2360
|
end
|
|
@@ -2669,7 +2540,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2669
2540
|
it "raises an error" do
|
|
2670
2541
|
expect {
|
|
2671
2542
|
person.posts.find(post.id)
|
|
2672
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2543
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
|
|
2673
2544
|
end
|
|
2674
2545
|
end
|
|
2675
2546
|
|
|
@@ -2684,7 +2555,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2684
2555
|
it "raises an error" do
|
|
2685
2556
|
expect {
|
|
2686
2557
|
person.posts.find(BSON::ObjectId.new)
|
|
2687
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2558
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
|
|
2688
2559
|
end
|
|
2689
2560
|
end
|
|
2690
2561
|
|
|
@@ -2733,7 +2604,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2733
2604
|
it "raises an error" do
|
|
2734
2605
|
expect {
|
|
2735
2606
|
person.posts.find([ BSON::ObjectId.new ])
|
|
2736
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2607
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Post with id\(s\)/)
|
|
2737
2608
|
end
|
|
2738
2609
|
end
|
|
2739
2610
|
|
|
@@ -2797,7 +2668,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2797
2668
|
it "raises an error" do
|
|
2798
2669
|
expect {
|
|
2799
2670
|
movie.ratings.find(BSON::ObjectId.new)
|
|
2800
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2671
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
|
|
2801
2672
|
end
|
|
2802
2673
|
end
|
|
2803
2674
|
|
|
@@ -2854,7 +2725,7 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
2854
2725
|
it "raises an error" do
|
|
2855
2726
|
expect {
|
|
2856
2727
|
movie.ratings.find([ BSON::ObjectId.new ])
|
|
2857
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
2728
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Rating with id\(s\)/)
|
|
2858
2729
|
end
|
|
2859
2730
|
end
|
|
2860
2731
|
|
|
@@ -4235,6 +4106,39 @@ describe Mongoid::Association::Referenced::HasMany::Proxy do
|
|
|
4235
4106
|
end
|
|
4236
4107
|
end
|
|
4237
4108
|
|
|
4109
|
+
context "when removing a document with counter_cache on" do
|
|
4110
|
+
let(:post) { Post.create! }
|
|
4111
|
+
let(:person1) { Person.create! }
|
|
4112
|
+
let(:person2) { Person.create! }
|
|
4113
|
+
|
|
4114
|
+
before do
|
|
4115
|
+
post.update_attribute(:person, person1)
|
|
4116
|
+
expect(person1.posts_count).to eq 1
|
|
4117
|
+
|
|
4118
|
+
person2
|
|
4119
|
+
post.update_attribute(:person, person2)
|
|
4120
|
+
person1.reload
|
|
4121
|
+
expect(person1.posts_count).to eq 0
|
|
4122
|
+
expect(person2.posts_count).to eq 1
|
|
4123
|
+
|
|
4124
|
+
post.update_attribute(:person, nil)
|
|
4125
|
+
person1.reload
|
|
4126
|
+
person2.reload
|
|
4127
|
+
end
|
|
4128
|
+
|
|
4129
|
+
it "the count field is updated" do
|
|
4130
|
+
expect(person2.posts_count).to eq 0
|
|
4131
|
+
end
|
|
4132
|
+
end
|
|
4133
|
+
|
|
4134
|
+
context "when there is a foreign key in the aliased associations" do
|
|
4135
|
+
it "has the correct aliases" do
|
|
4136
|
+
expect(Band.aliased_associations["artist_ids"]).to eq("artists")
|
|
4137
|
+
expect(Artist.aliased_associations.key?("band_id")).to be false
|
|
4138
|
+
expect(Artist.aliased_fields["band"]).to eq("band_id")
|
|
4139
|
+
end
|
|
4140
|
+
end
|
|
4141
|
+
|
|
4238
4142
|
context "when executing concat on foreign key array from the db" do
|
|
4239
4143
|
config_override :legacy_attributes, false
|
|
4240
4144
|
|
|
@@ -42,6 +42,7 @@ end
|
|
|
42
42
|
|
|
43
43
|
class HmmSchool
|
|
44
44
|
include Mongoid::Document
|
|
45
|
+
include Mongoid::Timestamps
|
|
45
46
|
|
|
46
47
|
has_many :students, class_name: 'HmmStudent'
|
|
47
48
|
|
|
@@ -51,8 +52,9 @@ end
|
|
|
51
52
|
|
|
52
53
|
class HmmStudent
|
|
53
54
|
include Mongoid::Document
|
|
55
|
+
include Mongoid::Timestamps
|
|
54
56
|
|
|
55
|
-
belongs_to :school, class_name: 'HmmSchool'
|
|
57
|
+
belongs_to :school, class_name: 'HmmSchool', touch: true
|
|
56
58
|
|
|
57
59
|
field :name, type: String
|
|
58
60
|
field :grade, type: Integer, default: 3
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require "spec_helper"
|
|
4
|
+
require_relative './has_many_models'
|
|
4
5
|
|
|
5
6
|
describe Mongoid::Association::Referenced::HasMany do
|
|
6
7
|
|
|
@@ -1245,4 +1246,28 @@ describe Mongoid::Association::Referenced::HasMany do
|
|
|
1245
1246
|
expect(association.create_relation(owner, target)).to be_a(Array)
|
|
1246
1247
|
end
|
|
1247
1248
|
end
|
|
1249
|
+
|
|
1250
|
+
context "when adding an object to the association" do
|
|
1251
|
+
let!(:start_time) { Timecop.freeze(Time.at(Time.now.to_i)) }
|
|
1252
|
+
|
|
1253
|
+
let(:update_time) do
|
|
1254
|
+
Timecop.freeze(Time.at(Time.now.to_i) + 2)
|
|
1255
|
+
end
|
|
1256
|
+
|
|
1257
|
+
after do
|
|
1258
|
+
Timecop.return
|
|
1259
|
+
end
|
|
1260
|
+
|
|
1261
|
+
let!(:school) { HmmSchool.create! }
|
|
1262
|
+
let!(:student) { HmmStudent.create! }
|
|
1263
|
+
|
|
1264
|
+
before do
|
|
1265
|
+
update_time
|
|
1266
|
+
student.update(school: school)
|
|
1267
|
+
end
|
|
1268
|
+
|
|
1269
|
+
it "updates the updated_at" do
|
|
1270
|
+
expect(student.updated_at).to eq(update_time)
|
|
1271
|
+
end
|
|
1272
|
+
end
|
|
1248
1273
|
end
|
|
@@ -91,7 +91,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
|
|
|
91
91
|
expect(document).to eq(object)
|
|
92
92
|
end
|
|
93
93
|
|
|
94
|
-
context 'when the object is already
|
|
94
|
+
context 'when the object is already associated with another object' do
|
|
95
95
|
|
|
96
96
|
let(:original_person) do
|
|
97
97
|
Person.new
|
|
@@ -105,7 +105,7 @@ describe Mongoid::Association::Referenced::HasOne::Buildable do
|
|
|
105
105
|
association.build(Person.new, object)
|
|
106
106
|
end
|
|
107
107
|
|
|
108
|
-
it 'clears the object of its previous
|
|
108
|
+
it 'clears the object of its previous association' do
|
|
109
109
|
expect(original_person.account).to be_nil
|
|
110
110
|
end
|
|
111
111
|
|
|
@@ -133,7 +133,7 @@ describe Mongoid::Association::Referenced::HasOne::Proxy do
|
|
|
133
133
|
it "detaches the previous relation" do
|
|
134
134
|
expect {
|
|
135
135
|
game.reload
|
|
136
|
-
}.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
136
|
+
}.to raise_error(Mongoid::Errors::DocumentNotFound, /Document\(s\) not found for class Game with id\(s\)/)
|
|
137
137
|
end
|
|
138
138
|
end
|
|
139
139
|
end
|
|
@@ -1139,4 +1139,110 @@ describe Mongoid::Association::Referenced::HasOne::Proxy do
|
|
|
1139
1139
|
end
|
|
1140
1140
|
end
|
|
1141
1141
|
end
|
|
1142
|
+
|
|
1143
|
+
context "when there is a foreign key in the aliased associations" do
|
|
1144
|
+
it "has the correct aliases" do
|
|
1145
|
+
# Instances of Driver do not respond to vehicle_id.
|
|
1146
|
+
expect(Driver.aliased_associations.key?("vehicle_id")).to be false
|
|
1147
|
+
expect(Vehicle.aliased_associations.key?("driver_id")).to be false
|
|
1148
|
+
expect(Vehicle.aliased_fields["driver"]).to eq("driver_id")
|
|
1149
|
+
end
|
|
1150
|
+
end
|
|
1151
|
+
|
|
1152
|
+
context "when the document is not persisted and the association is invalid" do
|
|
1153
|
+
|
|
1154
|
+
before do
|
|
1155
|
+
class HomParent
|
|
1156
|
+
include Mongoid::Document
|
|
1157
|
+
has_one :child, class_name: "HomChild"
|
|
1158
|
+
field :name
|
|
1159
|
+
validates :name, presence: true
|
|
1160
|
+
end
|
|
1161
|
+
|
|
1162
|
+
class HomChild; include Mongoid::Document; end
|
|
1163
|
+
|
|
1164
|
+
belongs_to
|
|
1165
|
+
child.parent = parent
|
|
1166
|
+
child.save
|
|
1167
|
+
end
|
|
1168
|
+
|
|
1169
|
+
after do
|
|
1170
|
+
Object.send(:remove_const, :HomParent)
|
|
1171
|
+
Object.send(:remove_const, :HomChild)
|
|
1172
|
+
end
|
|
1173
|
+
|
|
1174
|
+
let(:belongs_to) do
|
|
1175
|
+
HomChild.belongs_to :parent, autosave: true, validate: false, optional: optional
|
|
1176
|
+
end
|
|
1177
|
+
|
|
1178
|
+
let(:child) { HomChild.new }
|
|
1179
|
+
let(:parent) { HomParent.new }
|
|
1180
|
+
|
|
1181
|
+
|
|
1182
|
+
context "when belongs_to_required_by_default is true" do
|
|
1183
|
+
config_override :belongs_to_required_by_default, true
|
|
1184
|
+
|
|
1185
|
+
context "when optional is true" do
|
|
1186
|
+
let(:optional) { true }
|
|
1187
|
+
|
|
1188
|
+
it "persists the child with the parent_id" do
|
|
1189
|
+
expect(HomChild.first.parent_id).to eq(parent._id)
|
|
1190
|
+
expect(HomParent.count).to eq(0)
|
|
1191
|
+
end
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
context "when optional is false" do
|
|
1195
|
+
let(:optional) { false }
|
|
1196
|
+
|
|
1197
|
+
it "doesn't persist the parent or the child" do
|
|
1198
|
+
expect(HomChild.count).to eq(0)
|
|
1199
|
+
expect(HomParent.count).to eq(0)
|
|
1200
|
+
end
|
|
1201
|
+
end
|
|
1202
|
+
|
|
1203
|
+
context "when optional is not set" do
|
|
1204
|
+
let(:belongs_to) do
|
|
1205
|
+
HomChild.belongs_to :parent, autosave: true, validate: false
|
|
1206
|
+
end
|
|
1207
|
+
|
|
1208
|
+
it "doesn't persist the parent or the child" do
|
|
1209
|
+
expect(HomChild.count).to eq(0)
|
|
1210
|
+
expect(HomParent.count).to eq(0)
|
|
1211
|
+
end
|
|
1212
|
+
end
|
|
1213
|
+
end
|
|
1214
|
+
|
|
1215
|
+
context "when belongs_to_required_by_default is false" do
|
|
1216
|
+
config_override :belongs_to_required_by_default, false
|
|
1217
|
+
|
|
1218
|
+
context "when optional is true" do
|
|
1219
|
+
let(:optional) { true }
|
|
1220
|
+
|
|
1221
|
+
it "persists the child with the parent_id" do
|
|
1222
|
+
expect(HomChild.first.parent_id).to eq(parent._id)
|
|
1223
|
+
expect(HomParent.count).to eq(0)
|
|
1224
|
+
end
|
|
1225
|
+
end
|
|
1226
|
+
|
|
1227
|
+
context "when optional is false" do
|
|
1228
|
+
let(:optional) { false }
|
|
1229
|
+
|
|
1230
|
+
it "doesn't persist the parent or the child" do
|
|
1231
|
+
expect(HomChild.count).to eq(0)
|
|
1232
|
+
expect(HomParent.count).to eq(0)
|
|
1233
|
+
end
|
|
1234
|
+
end
|
|
1235
|
+
|
|
1236
|
+
context "when optional is not set" do
|
|
1237
|
+
let(:belongs_to) do
|
|
1238
|
+
HomChild.belongs_to :parent, autosave: true, validate: false
|
|
1239
|
+
end
|
|
1240
|
+
|
|
1241
|
+
it "persists the child with the parent_id" do
|
|
1242
|
+
expect(HomChild.first.parent_id).to eq(parent._id)
|
|
1243
|
+
expect(HomParent.count).to eq(0)
|
|
1244
|
+
end
|
|
1245
|
+
end
|
|
1246
|
+
end
|
|
1247
|
+
end
|
|
1142
1248
|
end
|
|
@@ -95,3 +95,19 @@ class HomAnimal
|
|
|
95
95
|
|
|
96
96
|
belongs_to :trainer, class_name: 'HomTrainer', scope: -> { where(name: 'Dave') }
|
|
97
97
|
end
|
|
98
|
+
|
|
99
|
+
class HomPost
|
|
100
|
+
include Mongoid::Document
|
|
101
|
+
|
|
102
|
+
field :title, type: String
|
|
103
|
+
|
|
104
|
+
has_one :comment, inverse_of: :post, class_name: 'HomComment'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
class HomComment
|
|
108
|
+
include Mongoid::Document
|
|
109
|
+
|
|
110
|
+
field :content, type: String
|
|
111
|
+
|
|
112
|
+
belongs_to :post, inverse_of: :comment, optional: true, class_name: 'HomPost'
|
|
113
|
+
end
|
|
@@ -496,4 +496,18 @@ describe "Syncable Association" do
|
|
|
496
496
|
expect(dog.reload.breed_ids).to eq([ breed.id ])
|
|
497
497
|
end
|
|
498
498
|
end
|
|
499
|
+
|
|
500
|
+
context "when setting one document on unpersisted HABTM association" do
|
|
501
|
+
let!(:dog) { Dog.create! }
|
|
502
|
+
let!(:breed) { Breed.new }
|
|
503
|
+
|
|
504
|
+
before do
|
|
505
|
+
breed.dogs = Dog.all
|
|
506
|
+
breed.save!
|
|
507
|
+
end
|
|
508
|
+
|
|
509
|
+
it "sets the foreign key on the other side" do
|
|
510
|
+
expect(dog.reload.breed_ids).to eq([breed._id])
|
|
511
|
+
end
|
|
512
|
+
end
|
|
499
513
|
end
|
|
@@ -329,7 +329,6 @@ describe Mongoid::Atomic::Paths do
|
|
|
329
329
|
context "assignment after saving" do
|
|
330
330
|
|
|
331
331
|
it "correctly sets the association for the embedded class" do
|
|
332
|
-
pending 'MONGOID-5039'
|
|
333
332
|
|
|
334
333
|
customer.home_address = CustomerAddress.new
|
|
335
334
|
customer.work_address = CustomerAddress.new
|
|
@@ -346,19 +345,6 @@ describe Mongoid::Atomic::Paths do
|
|
|
346
345
|
expect(customer.work_address.atomic_path).to eq("work_address")
|
|
347
346
|
end
|
|
348
347
|
end
|
|
349
|
-
|
|
350
|
-
context "inverse assignment" do
|
|
351
|
-
|
|
352
|
-
it "correctly returns the path for each embedded class" do
|
|
353
|
-
pending 'MONGOID-5039'
|
|
354
|
-
|
|
355
|
-
customer.work_address = CustomerAddress.new
|
|
356
|
-
customer.work_address.addressable = customer
|
|
357
|
-
|
|
358
|
-
expect(customer.home_address.atomic_path).to eq("home_address")
|
|
359
|
-
expect(customer.work_address.atomic_path).to eq("work_address")
|
|
360
|
-
end
|
|
361
|
-
end
|
|
362
348
|
end
|
|
363
349
|
end
|
|
364
350
|
end
|