mongoid 7.6.0 → 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 -30
- 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/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 +2 -1
- 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 +12 -9
- 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/options.rb +4 -0
- data/lib/mongoid/clients/sessions.rb +2 -14
- data/lib/mongoid/config.rb +15 -11
- data/lib/mongoid/contextual/aggregable/memory.rb +23 -15
- data/lib/mongoid/contextual/aggregable/mongo.rb +1 -1
- data/lib/mongoid/contextual/map_reduce.rb +2 -2
- data/lib/mongoid/contextual/memory.rb +55 -28
- 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/optional.rb +3 -9
- data/lib/mongoid/criteria/queryable/options.rb +1 -1
- data/lib/mongoid/criteria/queryable/selectable.rb +2 -24
- 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 -2
- 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 +12 -5
- 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/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/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 -4
- data/lib/mongoid.rb +1 -0
- data/spec/config/mongoid.yml +16 -0
- data/spec/integration/app_spec.rb +8 -12
- 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/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 +38 -5
- 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 +62 -13
- 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 +80 -11
- 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 +23 -30
- 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 +396 -158
- 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 +521 -14
- 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 -0
- data/spec/mongoid/criteria/queryable/selectable_spec.rb +77 -85
- 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 -1201
- 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 -0
- 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/docker_runner.rb +1 -8
- 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 +24 -17
- 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 +107 -33
- data/spec/shared/shlib/distro.sh +0 -10
- data/spec/shared/shlib/server.sh +33 -64
- data/spec/shared/shlib/set_env.sh +71 -12
- 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 -641
- metadata.gz.sig +0 -0
- data/lib/mongoid/errors/eager_load.rb +0 -23
- data/lib/mongoid/errors/invalid_value.rb +0 -17
- data/spec/mongoid/errors/eager_load_spec.rb +0 -31
- data/spec/shared/CANDIDATE.md +0 -28
- data/spec/shared/lib/mrss/release/candidate.rb +0 -281
- data/spec/shared/lib/mrss/release/product_data.rb +0 -144
- data/spec/shared/lib/tasks/candidate.rake +0 -64
|
@@ -265,4 +265,19 @@ describe 'embedded associations' do
|
|
|
265
265
|
end
|
|
266
266
|
end
|
|
267
267
|
end
|
|
268
|
+
|
|
269
|
+
context "when summing properties on an embedded child" do
|
|
270
|
+
let(:user) { EmmUser.new }
|
|
271
|
+
before do
|
|
272
|
+
user.orders.build(amount: 200)
|
|
273
|
+
expect(user.orders.sum(:amount)).to eq(200)
|
|
274
|
+
|
|
275
|
+
user.orders.delete_all
|
|
276
|
+
user.orders.build(amount: 500)
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
it "the cache is cleared after deletion" do
|
|
280
|
+
expect(user.orders.sum(:amount)).to eq(500)
|
|
281
|
+
end
|
|
282
|
+
end
|
|
268
283
|
end
|
|
@@ -172,8 +172,6 @@ describe 'embeds_many associations' do
|
|
|
172
172
|
# Mongoid uses the new value of `x` in the $pullAll query,
|
|
173
173
|
# which doesn't match the document that is in the database,
|
|
174
174
|
# resulting in the empty array assignment not taking effect.
|
|
175
|
-
pending 'MONGOID-5037'
|
|
176
|
-
|
|
177
175
|
canvas.shapes.first.x = 1
|
|
178
176
|
canvas.shapes = []
|
|
179
177
|
canvas.save!
|
|
@@ -203,4 +201,19 @@ describe 'embeds_many associations' do
|
|
|
203
201
|
end
|
|
204
202
|
end
|
|
205
203
|
end
|
|
204
|
+
|
|
205
|
+
context 'when an anonymous class defines an embeds_many association' do
|
|
206
|
+
let(:klass) do
|
|
207
|
+
Class.new do
|
|
208
|
+
include Mongoid::Document
|
|
209
|
+
embeds_many :addresses
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it 'loads the association correctly' do
|
|
214
|
+
expect { klass }.to_not raise_error
|
|
215
|
+
expect { klass.new.addresses }.to_not raise_error
|
|
216
|
+
expect(klass.new.addresses.build).to be_a Address
|
|
217
|
+
end
|
|
218
|
+
end
|
|
206
219
|
end
|
|
@@ -20,4 +20,22 @@ describe 'embeds_one associations' do
|
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
|
+
|
|
24
|
+
context 'when an anonymous class defines an embeds_one association' do
|
|
25
|
+
let(:klass) do
|
|
26
|
+
Class.new do
|
|
27
|
+
include Mongoid::Document
|
|
28
|
+
embeds_one :address
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it 'loads the association correctly' do
|
|
33
|
+
expect { klass }.to_not raise_error
|
|
34
|
+
expect { klass.new.address }.to_not raise_error
|
|
35
|
+
instance = klass.new
|
|
36
|
+
address = Address.new
|
|
37
|
+
instance.address = address
|
|
38
|
+
expect(instance.address).to eq address
|
|
39
|
+
end
|
|
40
|
+
end
|
|
23
41
|
end
|
|
@@ -27,6 +27,15 @@ describe 'Association foreign key configuration' do
|
|
|
27
27
|
expect(email.company.id).to eq(company.id)
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
it "has the correct criteria" do
|
|
31
|
+
company = ForeignKeySpec::Company.create!(c: "3")
|
|
32
|
+
email = ForeignKeySpec::Email.create!(company: company)
|
|
33
|
+
|
|
34
|
+
criteria = ForeignKeySpec::Email.where(company: company)
|
|
35
|
+
|
|
36
|
+
expect(criteria.selector).to eq({ "c_ref" => "3" })
|
|
37
|
+
end
|
|
38
|
+
|
|
30
39
|
context 'with default scope' do
|
|
31
40
|
context 'using default scope' do
|
|
32
41
|
it 'looks up child' do
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'spec_helper'
|
|
4
|
+
|
|
5
|
+
describe 'has_and_belongs_to_many associations' do
|
|
6
|
+
|
|
7
|
+
context 'when an anonymous class defines a has_and_belongs_to_many association' do
|
|
8
|
+
let(:klass) do
|
|
9
|
+
Class.new do
|
|
10
|
+
include Mongoid::Document
|
|
11
|
+
has_and_belongs_to_many :movies, inverse_of: nil
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it 'loads the association correctly' do
|
|
16
|
+
expect { klass }.to_not raise_error
|
|
17
|
+
expect { klass.new.movies }.to_not raise_error
|
|
18
|
+
expect(klass.new.movies.build).to be_a Movie
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -94,7 +94,7 @@ describe 'has_one associations' do
|
|
|
94
94
|
context 'using send' do
|
|
95
95
|
it 'delegates to the field' do
|
|
96
96
|
if reloaded
|
|
97
|
-
pending 'MONGOID-
|
|
97
|
+
pending 'MONGOID-5018'
|
|
98
98
|
end
|
|
99
99
|
|
|
100
100
|
parent.accreditation.send(:format).should == 'fmt'
|
|
@@ -173,4 +173,100 @@ describe 'has_one associations' do
|
|
|
173
173
|
end
|
|
174
174
|
end
|
|
175
175
|
end
|
|
176
|
+
|
|
177
|
+
context "when assigning to a has_one" do
|
|
178
|
+
let(:post) { HomPost.create! }
|
|
179
|
+
let(:comment1) { HomComment.create!(content: "Comment 1") }
|
|
180
|
+
|
|
181
|
+
context "when assigning the same value" do
|
|
182
|
+
let(:comment2) { HomComment.create! }
|
|
183
|
+
|
|
184
|
+
it "persists it correctly" do
|
|
185
|
+
post.comment = comment1
|
|
186
|
+
post.reload
|
|
187
|
+
expect(post.comment).to eq(comment1)
|
|
188
|
+
|
|
189
|
+
post.comment = comment1
|
|
190
|
+
post.reload
|
|
191
|
+
expect(post.comment).to eq(comment1)
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
context "when assigning two values with the same _id" do
|
|
196
|
+
let(:comment2) { HomComment.new(id: comment1.id) }
|
|
197
|
+
|
|
198
|
+
it "raises a duplicate key error" do
|
|
199
|
+
post.comment = comment1
|
|
200
|
+
expect do
|
|
201
|
+
post.comment = comment2
|
|
202
|
+
end.to raise_error(Mongo::Error::OperationFailure, /duplicate key/)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
context "when duping the object and changing attributes" do
|
|
207
|
+
let(:comment2) { comment1.dup }
|
|
208
|
+
|
|
209
|
+
before do
|
|
210
|
+
comment2.content = "Comment 2"
|
|
211
|
+
|
|
212
|
+
post.comment = comment1
|
|
213
|
+
post.reload
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
it "updates the attributes correctly" do
|
|
217
|
+
post.comment = comment2
|
|
218
|
+
post.reload
|
|
219
|
+
|
|
220
|
+
expect(post.comment).to eq(comment2)
|
|
221
|
+
expect(post.comment.content).to eq(comment2.content)
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
context "when explicitly setting the foreign key" do
|
|
226
|
+
let(:comment2) { HomComment.new(post_id: post.id, content: "2") }
|
|
227
|
+
|
|
228
|
+
it "persists the new comment" do
|
|
229
|
+
post.comment = comment1
|
|
230
|
+
post.reload
|
|
231
|
+
|
|
232
|
+
post.comment = comment2
|
|
233
|
+
post.reload
|
|
234
|
+
|
|
235
|
+
expect(post.comment).to eq(comment2)
|
|
236
|
+
expect(post.comment.content).to eq(comment2.content)
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
context "when reassigning the same value" do
|
|
241
|
+
let(:comment2) { HomComment.create!(content: "Comment 2") }
|
|
242
|
+
|
|
243
|
+
it "persists it correctly" do
|
|
244
|
+
post.comment = comment1
|
|
245
|
+
post.reload
|
|
246
|
+
expect(post.comment).to eq(comment1)
|
|
247
|
+
|
|
248
|
+
post.comment = comment2
|
|
249
|
+
post.reload
|
|
250
|
+
expect(post.comment).to eq(comment2)
|
|
251
|
+
|
|
252
|
+
post.comment = comment1
|
|
253
|
+
post.reload
|
|
254
|
+
expect(post.comment).to eq(nil)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
context "when overwriting an association" do
|
|
260
|
+
let(:post1) { HomPost.create!(title: "post 1") }
|
|
261
|
+
let(:post2) { HomPost.create!(title: "post 2") }
|
|
262
|
+
let(:comment) { HomComment.create(post: post1) }
|
|
263
|
+
|
|
264
|
+
it "does not overwrite the original value" do
|
|
265
|
+
pending "MONGOID-3999"
|
|
266
|
+
p1 = comment.post
|
|
267
|
+
expect(p1.title).to eq("post 1")
|
|
268
|
+
comment.post = post2
|
|
269
|
+
expect(p1.title).to eq("post 1")
|
|
270
|
+
end
|
|
271
|
+
end
|
|
176
272
|
end
|
|
@@ -49,7 +49,7 @@ describe 'association :scope option' do
|
|
|
49
49
|
it 'initially associates the documents in-memory' do
|
|
50
50
|
expect(trainer1.animal).to eq animal2
|
|
51
51
|
expect(trainer2.animal).to eq animal3
|
|
52
|
-
expect(animal1.trainer).to
|
|
52
|
+
expect(animal1.trainer).to be_nil
|
|
53
53
|
expect(animal2.trainer).to eq trainer1
|
|
54
54
|
expect(animal3.trainer).to eq trainer2
|
|
55
55
|
end
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
class Galaxy
|
|
2
2
|
include Mongoid::Document
|
|
3
|
+
include Mongoid::Timestamps
|
|
3
4
|
|
|
4
5
|
field :age, type: Integer
|
|
5
|
-
|
|
6
|
+
field :was_touched, type: Mongoid::Boolean, default: false
|
|
6
7
|
before_validation :set_age
|
|
7
8
|
|
|
8
9
|
embeds_many :stars
|
|
9
10
|
|
|
11
|
+
set_callback(:touch, :before) do |document|
|
|
12
|
+
self.was_touched = true
|
|
13
|
+
end
|
|
14
|
+
|
|
10
15
|
private
|
|
11
16
|
|
|
12
17
|
def set_age
|
|
@@ -16,15 +21,21 @@ end
|
|
|
16
21
|
|
|
17
22
|
class Star
|
|
18
23
|
include Mongoid::Document
|
|
24
|
+
include Mongoid::Timestamps
|
|
19
25
|
|
|
20
26
|
embedded_in :galaxy
|
|
21
27
|
|
|
22
28
|
field :age, type: Integer
|
|
29
|
+
field :was_touched_after_parent, type: Mongoid::Boolean, default: false
|
|
23
30
|
|
|
24
31
|
before_validation :set_age
|
|
25
32
|
|
|
26
33
|
embeds_many :planets
|
|
27
34
|
|
|
35
|
+
set_callback(:touch, :before) do |document|
|
|
36
|
+
self.was_touched_after_parent = true if galaxy.was_touched
|
|
37
|
+
end
|
|
38
|
+
|
|
28
39
|
private
|
|
29
40
|
|
|
30
41
|
def set_age
|
|
@@ -34,13 +45,19 @@ end
|
|
|
34
45
|
|
|
35
46
|
class Planet
|
|
36
47
|
include Mongoid::Document
|
|
48
|
+
include Mongoid::Timestamps
|
|
37
49
|
|
|
38
50
|
embedded_in :star
|
|
39
51
|
|
|
40
52
|
field :age, type: Integer
|
|
53
|
+
field :was_touched_after_parent, type: Mongoid::Boolean, default: false
|
|
41
54
|
|
|
42
55
|
before_validation :set_age
|
|
43
56
|
|
|
57
|
+
set_callback(:touch, :before) do |document|
|
|
58
|
+
self.was_touched_after_parent = true if star.was_touched_after_parent
|
|
59
|
+
end
|
|
60
|
+
|
|
44
61
|
private
|
|
45
62
|
|
|
46
63
|
def set_age
|
|
@@ -59,3 +76,80 @@ class Emission
|
|
|
59
76
|
|
|
60
77
|
attr_reader :previous
|
|
61
78
|
end
|
|
79
|
+
|
|
80
|
+
class Country
|
|
81
|
+
include Mongoid::Document
|
|
82
|
+
|
|
83
|
+
field :age
|
|
84
|
+
|
|
85
|
+
before_validation :set_age
|
|
86
|
+
|
|
87
|
+
embeds_one :president
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def set_age
|
|
92
|
+
self.age ||= 245
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
class President
|
|
97
|
+
include Mongoid::Document
|
|
98
|
+
|
|
99
|
+
embedded_in :country
|
|
100
|
+
|
|
101
|
+
field :age
|
|
102
|
+
|
|
103
|
+
field :name
|
|
104
|
+
|
|
105
|
+
before_validation :set_age
|
|
106
|
+
|
|
107
|
+
embeds_one :first_spouse
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
def set_age
|
|
112
|
+
self.age ||= 79
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
class FirstSpouse
|
|
117
|
+
include Mongoid::Document
|
|
118
|
+
|
|
119
|
+
embedded_in :president
|
|
120
|
+
|
|
121
|
+
field :name
|
|
122
|
+
field :age, type: Integer
|
|
123
|
+
|
|
124
|
+
before_validation :set_age
|
|
125
|
+
|
|
126
|
+
private
|
|
127
|
+
|
|
128
|
+
def set_age
|
|
129
|
+
self.age ||= 70
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
class Architect
|
|
134
|
+
include Mongoid::Document
|
|
135
|
+
|
|
136
|
+
has_and_belongs_to_many :buildings, after_add: :after_add_callback,
|
|
137
|
+
after_remove: :after_remove_callback, dependent: :nullify
|
|
138
|
+
|
|
139
|
+
field :after_add_num_buildings, type: Integer
|
|
140
|
+
field :after_remove_num_buildings, type: Integer
|
|
141
|
+
|
|
142
|
+
def after_add_callback(obj)
|
|
143
|
+
self.after_add_num_buildings = self.buildings.length
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def after_remove_callback(obj)
|
|
147
|
+
self.after_remove_num_buildings = self.buildings.length
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
class Building
|
|
152
|
+
include Mongoid::Document
|
|
153
|
+
|
|
154
|
+
has_and_belongs_to_many :architects, dependent: :nullify
|
|
155
|
+
end
|
|
@@ -188,8 +188,6 @@ describe 'callbacks integration tests' do
|
|
|
188
188
|
end
|
|
189
189
|
|
|
190
190
|
it 'persists the attribute value' do
|
|
191
|
-
pending 'MONGOID-4476'
|
|
192
|
-
|
|
193
191
|
Galaxy.find(instance.id).stars.first.planets.first.age.should == 2_000
|
|
194
192
|
end
|
|
195
193
|
end
|
|
@@ -211,18 +209,242 @@ describe 'callbacks integration tests' do
|
|
|
211
209
|
end
|
|
212
210
|
end
|
|
213
211
|
end
|
|
212
|
+
|
|
213
|
+
context 'when updating top-level embeds_one document via #update_attributes!' do
|
|
214
|
+
let!(:instance) do
|
|
215
|
+
Country.create!
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
context 'embedded document' do
|
|
219
|
+
shared_examples 'persists the attribute value' do
|
|
220
|
+
it 'writes the attribute value into the model' do
|
|
221
|
+
instance.president.age.should == 79
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it 'persists the attribute value' do
|
|
225
|
+
Country.find(instance.id).president.age.should == 79
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
context 'set as a document instance' do
|
|
230
|
+
before do
|
|
231
|
+
instance.update_attributes!(president: President.new)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
include_examples 'persists the attribute value'
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
context 'set as attributes on parent' do
|
|
238
|
+
before do
|
|
239
|
+
instance.update_attributes!(president: { name: "Abraham Lincoln" })
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
include_examples 'persists the attribute value'
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
context 'nested embedded document' do
|
|
247
|
+
shared_examples 'persists the attribute value' do
|
|
248
|
+
it 'writes the attribute value into the model' do
|
|
249
|
+
instance.president.first_spouse.age.should == 70
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
it 'persists the attribute value' do
|
|
253
|
+
Country.find(instance.id).president.first_spouse.age.should == 70
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
context 'set as a document instance' do
|
|
258
|
+
before do
|
|
259
|
+
instance.update_attributes!(president: President.new(first_spouse: FirstSpouse.new))
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
include_examples 'persists the attribute value'
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
context 'set as attributes on parent' do
|
|
266
|
+
before do
|
|
267
|
+
instance.update_attributes!(president: { first_spouse: { name: "Mary Todd Lincoln" } })
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
include_examples 'persists the attribute value'
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
214
274
|
end
|
|
215
275
|
|
|
216
276
|
context 'attribute_was value in after_save callback' do
|
|
217
277
|
let!(:obj) { Emission.create!(frequency: 1) }
|
|
218
278
|
|
|
219
279
|
it 'is set to the new value' do
|
|
220
|
-
pending 'MONGOID-5104'
|
|
221
|
-
|
|
222
280
|
obj.frequency = 2
|
|
223
281
|
obj.save!
|
|
224
282
|
|
|
225
283
|
obj.previous.should == 2
|
|
226
284
|
end
|
|
227
285
|
end
|
|
286
|
+
|
|
287
|
+
context 'atomic_selector in after_save callback' do
|
|
288
|
+
let(:name) do
|
|
289
|
+
'Alice'
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
let(:new_name) do
|
|
293
|
+
'Bob'
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
class CBIntSpecProfile
|
|
297
|
+
include Mongoid::Document
|
|
298
|
+
field :name, type: String
|
|
299
|
+
shard_key :name
|
|
300
|
+
|
|
301
|
+
attr_reader :atomic_selector_in_after_save
|
|
302
|
+
|
|
303
|
+
after_save do |document|
|
|
304
|
+
@atomic_selector_in_after_save = document.atomic_selector
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
it 'has updated attributes' do
|
|
309
|
+
profile = CBIntSpecProfile.create!(name: name)
|
|
310
|
+
profile.name = new_name
|
|
311
|
+
profile.save!
|
|
312
|
+
expect(
|
|
313
|
+
profile.atomic_selector_in_after_save['name']
|
|
314
|
+
).to eq(new_name)
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
context "When touching an embedded document" do
|
|
319
|
+
let(:planet) { Planet.new }
|
|
320
|
+
let(:star) { Star.new }
|
|
321
|
+
let(:galaxy) { Galaxy.create! }
|
|
322
|
+
|
|
323
|
+
before do
|
|
324
|
+
star.planets << planet
|
|
325
|
+
galaxy.stars << star
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
it "the parent document touch callback gets called before the child" do
|
|
329
|
+
planet.touch
|
|
330
|
+
expect(galaxy.was_touched).to be true
|
|
331
|
+
expect(star.was_touched_after_parent).to be true
|
|
332
|
+
expect(planet.was_touched_after_parent).to be true
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
context "when reloading has_and_belongs_to_many after_save and after_remove callbacks" do
|
|
337
|
+
|
|
338
|
+
let(:architect) { Architect.create }
|
|
339
|
+
|
|
340
|
+
let(:b1) { Building.create }
|
|
341
|
+
|
|
342
|
+
let(:b2) { Building.create }
|
|
343
|
+
|
|
344
|
+
let(:b3) { Building.create }
|
|
345
|
+
|
|
346
|
+
it "counts added/removed buildings correctly" do
|
|
347
|
+
architect.buildings << b1
|
|
348
|
+
expect(architect.after_add_num_buildings).to eq(1)
|
|
349
|
+
|
|
350
|
+
architect.reload
|
|
351
|
+
architect.buildings << b2
|
|
352
|
+
expect(architect.after_add_num_buildings).to eq(2)
|
|
353
|
+
|
|
354
|
+
architect.reload
|
|
355
|
+
architect.buildings << b3
|
|
356
|
+
expect(architect.after_add_num_buildings).to eq(3)
|
|
357
|
+
|
|
358
|
+
architect.reload
|
|
359
|
+
architect.buildings.delete(b3)
|
|
360
|
+
expect(architect.after_remove_num_buildings).to eq(2)
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
context '_previously was methods in after_save callback' do
|
|
365
|
+
let(:title) do
|
|
366
|
+
"Title"
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
let(:updated_title) do
|
|
370
|
+
"Updated title"
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
let(:age) do
|
|
374
|
+
10
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
it do
|
|
378
|
+
class PreviouslyWasPerson
|
|
379
|
+
include Mongoid::Document
|
|
380
|
+
|
|
381
|
+
field :title, type: String
|
|
382
|
+
field :age, type: Integer
|
|
383
|
+
|
|
384
|
+
attr_reader :after_save_vals
|
|
385
|
+
|
|
386
|
+
set_callback :save, :after do |doc|
|
|
387
|
+
@after_save_vals ||= []
|
|
388
|
+
@after_save_vals << [doc.title_previously_was, doc.age_previously_was]
|
|
389
|
+
end
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
person = PreviouslyWasPerson.create!(title: title, age: age)
|
|
393
|
+
person.title = updated_title
|
|
394
|
+
person.save!
|
|
395
|
+
expect(person.after_save_vals).to eq([
|
|
396
|
+
# Field values are nil before create
|
|
397
|
+
[nil, nil],
|
|
398
|
+
[title, age]
|
|
399
|
+
])
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
context 'previously_new_record? in after_save' do
|
|
404
|
+
it do
|
|
405
|
+
class PreviouslyNewRecordPerson
|
|
406
|
+
include Mongoid::Document
|
|
407
|
+
|
|
408
|
+
field :title, type: String
|
|
409
|
+
field :age, type: Integer
|
|
410
|
+
|
|
411
|
+
attr_reader :previously_new_record_value
|
|
412
|
+
|
|
413
|
+
set_callback :save, :after do |doc|
|
|
414
|
+
@previously_new_record_value = doc.previously_new_record?
|
|
415
|
+
end
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
person = PreviouslyNewRecordPerson.create!(title: "title", age: 55)
|
|
419
|
+
expect(person.previously_new_record_value).to be_truthy
|
|
420
|
+
person.title = "New title"
|
|
421
|
+
person.save!
|
|
422
|
+
expect(person.previously_new_record_value).to be_falsey
|
|
423
|
+
end
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
context 'previously_persisted? in after_destroy' do
|
|
427
|
+
it do
|
|
428
|
+
class PreviouslyPersistedPerson
|
|
429
|
+
include Mongoid::Document
|
|
430
|
+
|
|
431
|
+
field :title, type: String
|
|
432
|
+
field :age, type: Integer
|
|
433
|
+
|
|
434
|
+
attr_reader :previously_persisted_value
|
|
435
|
+
|
|
436
|
+
set_callback :destroy, :after do |doc|
|
|
437
|
+
@previously_persisted_value = doc.previously_persisted?
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
unsaved_person = PreviouslyPersistedPerson.new(title: "title", age: 55)
|
|
442
|
+
unsaved_person.destroy
|
|
443
|
+
expect(unsaved_person.previously_persisted_value).to be_falsey
|
|
444
|
+
|
|
445
|
+
saved_person = PreviouslyPersistedPerson.create(title: "title", age: 55)
|
|
446
|
+
saved_person.destroy
|
|
447
|
+
expect(saved_person.previously_persisted_value).to be_truthy
|
|
448
|
+
end
|
|
449
|
+
end
|
|
228
450
|
end
|