mongoid 8.0.3 → 8.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -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/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/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/shardable_models.rb +14 -0
- data/spec/mongoid/shardable_spec.rb +153 -61
- 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")
|