mongoid 8.0.3 → 8.0.5
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 +0 -0
- data/Rakefile +25 -0
- data/lib/mongoid/association/embedded/embeds_many/proxy.rb +17 -15
- data/lib/mongoid/association/referenced/has_and_belongs_to_many/proxy.rb +4 -0
- data/lib/mongoid/association/referenced/has_many/proxy.rb +4 -0
- data/lib/mongoid/atomic.rb +7 -0
- data/lib/mongoid/changeable.rb +1 -3
- data/lib/mongoid/criteria/queryable/extensions/array.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/hash.rb +1 -1
- data/lib/mongoid/criteria/queryable/extensions/numeric.rb +0 -8
- data/lib/mongoid/criteria/queryable/extensions/string.rb +1 -11
- data/lib/mongoid/criteria/queryable/extensions/symbol.rb +0 -10
- data/lib/mongoid/criteria/translator.rb +45 -0
- data/lib/mongoid/criteria.rb +1 -0
- data/lib/mongoid/document.rb +50 -13
- data/lib/mongoid/factory.rb +21 -8
- data/lib/mongoid/matcher.rb +21 -6
- data/lib/mongoid/reloadable.rb +3 -5
- data/lib/mongoid/shardable.rb +35 -11
- data/lib/mongoid/threaded.rb +30 -0
- data/lib/mongoid/traversable.rb +1 -1
- data/lib/mongoid/version.rb +1 -1
- data/spec/mongoid/association/embedded/embeds_many/proxy_spec.rb +37 -32
- data/spec/mongoid/association/referenced/has_and_belongs_to_many/proxy_spec.rb +143 -197
- data/spec/mongoid/association/referenced/has_many/proxy_spec.rb +102 -114
- data/spec/mongoid/attributes_spec.rb +2 -2
- data/spec/mongoid/criteria/queryable/extensions/string_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/extensions/symbol_spec.rb +0 -59
- data/spec/mongoid/criteria/queryable/optional_spec.rb +15 -0
- data/spec/mongoid/criteria/translator_spec.rb +132 -0
- data/spec/mongoid/reloadable_spec.rb +24 -0
- data/spec/mongoid/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +153 -61
- data/spec/mongoid_spec.rb +1 -1
- data.tar.gz.sig +0 -0
- metadata +656 -648
- metadata.gz.sig +0 -0
@@ -1862,51 +1862,56 @@ describe Mongoid::Association::Embedded::EmbedsMany::Proxy do
|
|
1862
1862
|
end
|
1863
1863
|
end
|
1864
1864
|
|
1865
|
-
|
1865
|
+
%i[ delete delete_one ].each do |method|
|
1866
|
+
describe "\##{method}" do
|
1867
|
+
let(:address_one) { Address.new(street: "first") }
|
1868
|
+
let(:address_two) { Address.new(street: "second") }
|
1866
1869
|
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
|
1871
|
-
let(:address_one) do
|
1872
|
-
Address.new(street: "first")
|
1873
|
-
end
|
1870
|
+
before do
|
1871
|
+
person.addresses << [ address_one, address_two ]
|
1872
|
+
end
|
1874
1873
|
|
1875
|
-
|
1876
|
-
|
1877
|
-
|
1874
|
+
shared_examples_for 'deleting from the collection' do
|
1875
|
+
context 'when the document exists in the relation' do
|
1876
|
+
let!(:deleted) do
|
1877
|
+
person.addresses.send(method, address_one)
|
1878
|
+
end
|
1878
1879
|
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1880
|
+
it 'deletes the document' do
|
1881
|
+
expect(person.addresses).to eq([ address_two ])
|
1882
|
+
expect(person.reload.addresses).to eq([ address_two ]) if person.persisted?
|
1883
|
+
end
|
1882
1884
|
|
1883
|
-
|
1885
|
+
it 'deletes the document from the unscoped' do
|
1886
|
+
expect(person.addresses.send(:_unscoped)).to eq([ address_two ])
|
1887
|
+
end
|
1884
1888
|
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1889
|
+
it 'reindexes the relation' do
|
1890
|
+
expect(address_two._index).to eq(0)
|
1891
|
+
end
|
1888
1892
|
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1893
|
+
it 'returns the document' do
|
1894
|
+
expect(deleted).to eq(address_one)
|
1895
|
+
end
|
1896
|
+
end
|
1892
1897
|
|
1893
|
-
|
1894
|
-
|
1898
|
+
context 'when the document does not exist' do
|
1899
|
+
it 'returns nil' do
|
1900
|
+
expect(person.addresses.send(method, Address.new)).to be_nil
|
1901
|
+
end
|
1902
|
+
end
|
1895
1903
|
end
|
1896
1904
|
|
1897
|
-
|
1898
|
-
|
1899
|
-
end
|
1905
|
+
context 'when the root document is unpersisted' do
|
1906
|
+
let(:person) { Person.new }
|
1900
1907
|
|
1901
|
-
|
1902
|
-
expect(deleted).to eq(address_one)
|
1908
|
+
it_behaves_like 'deleting from the collection'
|
1903
1909
|
end
|
1904
|
-
end
|
1905
1910
|
|
1906
|
-
|
1911
|
+
context 'when the root document is persisted' do
|
1912
|
+
let(:person) { Person.create }
|
1907
1913
|
|
1908
|
-
|
1909
|
-
expect(person.addresses.delete(Address.new)).to be_nil
|
1914
|
+
it_behaves_like 'deleting from the collection'
|
1910
1915
|
end
|
1911
1916
|
end
|
1912
1917
|
end
|
@@ -2087,283 +2087,229 @@ describe Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy do
|
|
2087
2087
|
end
|
2088
2088
|
end
|
2089
2089
|
|
2090
|
-
|
2090
|
+
%i[ delete delete_one ].each do |method|
|
2091
|
+
describe "\##{method}" do
|
2092
|
+
let(:person) { Person.create! }
|
2093
|
+
let(:preference_one) { Preference.create!(name: "Testing") }
|
2094
|
+
let(:preference_two) { Preference.create!(name: "Test") }
|
2091
2095
|
|
2092
|
-
|
2093
|
-
|
2094
|
-
end
|
2095
|
-
|
2096
|
-
let(:preference_one) do
|
2097
|
-
Preference.create!(name: "Testing")
|
2098
|
-
end
|
2099
|
-
|
2100
|
-
let(:preference_two) do
|
2101
|
-
Preference.create!(name: "Test")
|
2102
|
-
end
|
2103
|
-
|
2104
|
-
before do
|
2105
|
-
person.preferences << [ preference_one, preference_two ]
|
2106
|
-
end
|
2107
|
-
|
2108
|
-
context "when the document exists" do
|
2109
|
-
|
2110
|
-
let!(:deleted) do
|
2111
|
-
person.preferences.delete(preference_one)
|
2112
|
-
end
|
2113
|
-
|
2114
|
-
it "removes the document from the relation" do
|
2115
|
-
expect(person.preferences).to eq([ preference_two ])
|
2116
|
-
end
|
2117
|
-
|
2118
|
-
it "returns the document" do
|
2119
|
-
expect(deleted).to eq(preference_one)
|
2120
|
-
end
|
2121
|
-
|
2122
|
-
it "removes the document key from the foreign key" do
|
2123
|
-
expect(person.preference_ids).to eq([ preference_two.id ])
|
2124
|
-
end
|
2125
|
-
|
2126
|
-
it "removes the inverse reference" do
|
2127
|
-
expect(deleted.reload.people).to be_empty
|
2128
|
-
end
|
2129
|
-
|
2130
|
-
it "removes the base id from the inverse keys" do
|
2131
|
-
expect(deleted.reload.person_ids).to be_empty
|
2096
|
+
before do
|
2097
|
+
person.preferences << [ preference_one, preference_two ]
|
2132
2098
|
end
|
2133
2099
|
|
2134
|
-
context
|
2135
|
-
|
2136
|
-
|
2137
|
-
person.reload
|
2138
|
-
preference_one.reload
|
2139
|
-
preference_two.reload
|
2100
|
+
context 'when the document exists' do
|
2101
|
+
let!(:deleted) do
|
2102
|
+
person.preferences.send(method, preference_one)
|
2140
2103
|
end
|
2141
2104
|
|
2142
|
-
it
|
2105
|
+
it 'removes the document from the relation' do
|
2143
2106
|
expect(person.preferences).to eq([ preference_two ])
|
2144
2107
|
end
|
2145
2108
|
|
2146
|
-
it
|
2147
|
-
expect(
|
2109
|
+
it 'returns the document' do
|
2110
|
+
expect(deleted).to eq(preference_one)
|
2148
2111
|
end
|
2149
|
-
end
|
2150
|
-
end
|
2151
|
-
|
2152
|
-
context "when the document does not exist" do
|
2153
|
-
|
2154
|
-
let!(:deleted) do
|
2155
|
-
person.preferences.delete(Preference.new)
|
2156
|
-
end
|
2157
|
-
|
2158
|
-
it "returns nil" do
|
2159
|
-
expect(deleted).to be_nil
|
2160
|
-
end
|
2161
|
-
|
2162
|
-
it "does not modify the relation" do
|
2163
|
-
expect(person.preferences).to eq([ preference_one, preference_two ])
|
2164
|
-
end
|
2165
|
-
|
2166
|
-
it "does not modify the keys" do
|
2167
|
-
expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
|
2168
|
-
end
|
2169
|
-
end
|
2170
2112
|
|
2171
|
-
|
2172
|
-
|
2173
|
-
context "when :inverse_of is set" do
|
2174
|
-
|
2175
|
-
let(:event) do
|
2176
|
-
Event.create!
|
2113
|
+
it 'removes the document key from the foreign key' do
|
2114
|
+
expect(person.preference_ids).to eq([ preference_two.id ])
|
2177
2115
|
end
|
2178
2116
|
|
2179
|
-
|
2180
|
-
|
2117
|
+
it 'removes the inverse reference' do
|
2118
|
+
expect(deleted.reload.people).to be_empty
|
2181
2119
|
end
|
2182
2120
|
|
2183
|
-
it
|
2184
|
-
expect(
|
2121
|
+
it 'removes the base id from the inverse keys' do
|
2122
|
+
expect(deleted.reload.person_ids).to be_empty
|
2185
2123
|
end
|
2186
|
-
end
|
2187
|
-
end
|
2188
|
-
|
2189
|
-
context "when the relationships are self referencing" do
|
2190
2124
|
|
2191
|
-
|
2192
|
-
|
2193
|
-
|
2125
|
+
context 'and person and preferences are reloaded' do
|
2126
|
+
before do
|
2127
|
+
person.reload
|
2128
|
+
preference_one.reload
|
2129
|
+
preference_two.reload
|
2130
|
+
end
|
2194
2131
|
|
2195
|
-
|
2196
|
-
|
2197
|
-
|
2132
|
+
it 'nullifies the deleted preference' do
|
2133
|
+
expect(person.preferences).to eq([ preference_two ])
|
2134
|
+
end
|
2198
2135
|
|
2199
|
-
|
2200
|
-
|
2136
|
+
it 'retains the ids for one preference' do
|
2137
|
+
expect(person.preference_ids).to eq([ preference_two.id ])
|
2138
|
+
end
|
2139
|
+
end
|
2201
2140
|
end
|
2202
2141
|
|
2203
|
-
context
|
2204
|
-
|
2142
|
+
context 'when the document does not exist' do
|
2205
2143
|
let!(:deleted) do
|
2206
|
-
|
2207
|
-
end
|
2208
|
-
|
2209
|
-
it "deletes the document from the relation" do
|
2210
|
-
expect(tag_one.related).to be_empty
|
2144
|
+
person.preferences.send(method, Preference.new)
|
2211
2145
|
end
|
2212
2146
|
|
2213
|
-
it
|
2214
|
-
expect(
|
2147
|
+
it 'returns nil' do
|
2148
|
+
expect(deleted).to be_nil
|
2215
2149
|
end
|
2216
2150
|
|
2217
|
-
it
|
2218
|
-
expect(
|
2151
|
+
it 'does not modify the relation' do
|
2152
|
+
expect(person.preferences).to eq([ preference_one, preference_two ])
|
2219
2153
|
end
|
2220
2154
|
|
2221
|
-
it
|
2222
|
-
expect(
|
2155
|
+
it 'does not modify the keys' do
|
2156
|
+
expect(person.preference_ids).to eq([ preference_one.id, preference_two.id ])
|
2223
2157
|
end
|
2224
2158
|
end
|
2225
2159
|
|
2226
|
-
context
|
2160
|
+
context 'when :dependent => :nullify is set' do
|
2161
|
+
context 'when :inverse_of is set' do
|
2162
|
+
let(:event) { Event.create! }
|
2227
2163
|
|
2228
|
-
|
2229
|
-
|
2230
|
-
let(:reloaded) do
|
2231
|
-
tag_one.reload
|
2232
|
-
end
|
2233
|
-
|
2234
|
-
let!(:deleted) do
|
2235
|
-
reloaded.related.delete(tag_two)
|
2236
|
-
end
|
2237
|
-
|
2238
|
-
it "deletes the document from the relation" do
|
2239
|
-
expect(reloaded.related).to be_empty
|
2164
|
+
before do
|
2165
|
+
person.administrated_events << [ event ]
|
2240
2166
|
end
|
2241
2167
|
|
2242
|
-
it
|
2243
|
-
expect(
|
2168
|
+
it 'deletes the document' do
|
2169
|
+
expect(event.delete).to be true
|
2244
2170
|
end
|
2171
|
+
end
|
2172
|
+
end
|
2245
2173
|
|
2246
|
-
|
2247
|
-
|
2248
|
-
|
2174
|
+
context 'when the relationships are self referencing' do
|
2175
|
+
let(:tag_one) { Tag.create!(text: "one") }
|
2176
|
+
let(:tag_two) { Tag.create!(text: "two") }
|
2249
2177
|
|
2250
|
-
|
2251
|
-
|
2252
|
-
end
|
2178
|
+
before do
|
2179
|
+
tag_one.related << tag_two
|
2253
2180
|
end
|
2254
2181
|
|
2255
|
-
context
|
2256
|
-
|
2257
|
-
let(:reloaded) do
|
2258
|
-
tag_two.reload
|
2259
|
-
end
|
2182
|
+
context 'when deleting without reloading' do
|
2183
|
+
let!(:deleted) { tag_one.related.send(method, tag_two) }
|
2260
2184
|
|
2261
|
-
|
2262
|
-
|
2185
|
+
it 'deletes the document from the relation' do
|
2186
|
+
expect(tag_one.related).to be_empty
|
2263
2187
|
end
|
2264
2188
|
|
2265
|
-
it
|
2266
|
-
expect(
|
2189
|
+
it 'deletes the foreign key from the relation' do
|
2190
|
+
expect(tag_one.related_ids).to be_empty
|
2267
2191
|
end
|
2268
2192
|
|
2269
|
-
it
|
2270
|
-
expect(
|
2193
|
+
it 'removes the reference from the inverse' do
|
2194
|
+
expect(deleted.related).to be_empty
|
2271
2195
|
end
|
2272
2196
|
|
2273
|
-
it
|
2197
|
+
it 'removes the foreign keys from the inverse' do
|
2274
2198
|
expect(deleted.related_ids).to be_empty
|
2275
2199
|
end
|
2276
2200
|
end
|
2277
|
-
end
|
2278
|
-
end
|
2279
2201
|
|
2280
|
-
|
2202
|
+
context 'when deleting with reloading' do
|
2203
|
+
context "when deleting from the front side" do
|
2204
|
+
let(:reloaded) { tag_one.reload }
|
2205
|
+
let!(:deleted) { reloaded.related.send(method, tag_two) }
|
2281
2206
|
|
2282
|
-
|
2283
|
-
|
2284
|
-
|
2207
|
+
it 'deletes the document from the relation' do
|
2208
|
+
expect(reloaded.related).to be_empty
|
2209
|
+
end
|
2285
2210
|
|
2286
|
-
|
2287
|
-
|
2288
|
-
|
2211
|
+
it 'deletes the foreign key from the relation' do
|
2212
|
+
expect(reloaded.related_ids).to be_empty
|
2213
|
+
end
|
2289
2214
|
|
2290
|
-
|
2291
|
-
|
2292
|
-
|
2215
|
+
it 'removes the reference from the inverse' do
|
2216
|
+
expect(deleted.related).to be_empty
|
2217
|
+
end
|
2293
2218
|
|
2294
|
-
|
2219
|
+
it 'removes the foreign keys from the inverse' do
|
2220
|
+
expect(deleted.related_ids).to be_empty
|
2221
|
+
end
|
2222
|
+
end
|
2295
2223
|
|
2296
|
-
|
2224
|
+
context 'when deleting from the inverse side' do
|
2225
|
+
let(:reloaded) { tag_two.reload }
|
2226
|
+
let!(:deleted) { reloaded.related.send(method, tag_one) }
|
2297
2227
|
|
2298
|
-
|
2299
|
-
|
2300
|
-
|
2228
|
+
it 'deletes the document from the relation' do
|
2229
|
+
expect(reloaded.related).to be_empty
|
2230
|
+
end
|
2301
2231
|
|
2302
|
-
|
2303
|
-
|
2304
|
-
|
2232
|
+
it 'deletes the foreign key from the relation' do
|
2233
|
+
expect(reloaded.related_ids).to be_empty
|
2234
|
+
end
|
2305
2235
|
|
2306
|
-
|
2307
|
-
|
2236
|
+
it 'removes the foreign keys from the inverse' do
|
2237
|
+
expect(deleted.related_ids).to be_empty
|
2238
|
+
end
|
2308
2239
|
end
|
2309
2240
|
end
|
2241
|
+
end
|
2310
2242
|
|
2311
|
-
|
2312
|
-
|
2313
|
-
|
2314
|
-
expect(post).to receive(:before_remove_tag).and_raise
|
2315
|
-
begin; post.tags.delete(tag); rescue; end
|
2316
|
-
end
|
2243
|
+
context 'when the association has callbacks' do
|
2244
|
+
let(:post) { Post.new }
|
2245
|
+
let(:tag) { Tag.new }
|
2317
2246
|
|
2318
|
-
|
2319
|
-
|
2320
|
-
end
|
2247
|
+
before do
|
2248
|
+
post.tags << tag
|
2321
2249
|
end
|
2322
|
-
end
|
2323
2250
|
|
2324
|
-
|
2251
|
+
context 'when the callback is a before_remove' do
|
2252
|
+
context 'when there are no errors' do
|
2253
|
+
before do
|
2254
|
+
post.tags.send(method, tag)
|
2255
|
+
end
|
2325
2256
|
|
2326
|
-
|
2257
|
+
it 'executes the callback' do
|
2258
|
+
expect(post.before_remove_called).to be true
|
2259
|
+
end
|
2327
2260
|
|
2328
|
-
|
2329
|
-
|
2261
|
+
it 'removes the document from the relation' do
|
2262
|
+
expect(post.tags).to be_empty
|
2263
|
+
end
|
2330
2264
|
end
|
2331
2265
|
|
2332
|
-
|
2333
|
-
|
2334
|
-
|
2266
|
+
context "when errors are raised" do
|
2267
|
+
before do
|
2268
|
+
expect(post).to receive(:before_remove_tag).and_raise
|
2269
|
+
begin; post.tags.send(method, tag); rescue; end
|
2270
|
+
end
|
2335
2271
|
|
2336
|
-
|
2337
|
-
|
2272
|
+
it 'does not remove the document from the relation' do
|
2273
|
+
expect(post.tags).to eq([ tag ])
|
2274
|
+
end
|
2338
2275
|
end
|
2339
2276
|
end
|
2340
2277
|
|
2341
|
-
context
|
2278
|
+
context 'when the callback is an after_remove' do
|
2279
|
+
context 'when no errors are raised' do
|
2280
|
+
before do
|
2281
|
+
post.tags.send(method, tag)
|
2282
|
+
end
|
2342
2283
|
|
2343
|
-
|
2344
|
-
|
2345
|
-
|
2284
|
+
it 'executes the callback' do
|
2285
|
+
expect(post.after_remove_called).to be true
|
2286
|
+
end
|
2287
|
+
|
2288
|
+
it 'removes the document from the relation' do
|
2289
|
+
expect(post.tags).to be_empty
|
2290
|
+
end
|
2346
2291
|
end
|
2347
2292
|
|
2348
|
-
|
2349
|
-
|
2293
|
+
context 'when errors are raised' do
|
2294
|
+
before do
|
2295
|
+
expect(post).to receive(:after_remove_tag).and_raise
|
2296
|
+
begin; post.tags.send(method, tag); rescue; end
|
2297
|
+
end
|
2298
|
+
|
2299
|
+
it 'removes the document from the relation' do
|
2300
|
+
expect(post.tags).to be_empty
|
2301
|
+
end
|
2350
2302
|
end
|
2351
2303
|
end
|
2352
2304
|
end
|
2353
2305
|
end
|
2354
2306
|
end
|
2355
2307
|
|
2356
|
-
[
|
2357
|
-
|
2358
|
-
|
2359
|
-
|
2360
|
-
|
2361
|
-
|
2362
|
-
context "when conditions are provided" do
|
2363
|
-
|
2364
|
-
let(:person) do
|
2365
|
-
Person.create!
|
2366
|
-
end
|
2308
|
+
%i[ delete_all destroy_all ].each do |method|
|
2309
|
+
describe "\##{method}" do
|
2310
|
+
context 'when the relation is not polymorphic' do
|
2311
|
+
context 'when conditions are provided' do
|
2312
|
+
let(:person) { Person.create! }
|
2367
2313
|
|
2368
2314
|
let!(:preference_one) do
|
2369
2315
|
person.preferences.create!(name: "Testing")
|