Skip to content

Commit 2cfa2b2

Browse files
committed
MONGOID-5204 default_scopes duplication, query scope inconsistency (#5137)
* MONGOID-5204 dont add duplicates to selector * MONGOID-5204 add criteria tests * MONGOID-5204 move subclass to its own file * MONGOID-5204 remove trailing whitespace
1 parent 7fe438b commit 2cfa2b2

File tree

4 files changed

+32
-1
lines changed

4 files changed

+32
-1
lines changed

lib/mongoid/criteria/queryable/storable.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def add_field_expression(field, value)
5454
# adding them to the existing hash.
5555
new_value = selector[field].merge(value)
5656
selector.store(field, new_value)
57-
else
57+
elsif selector[field] != value
5858
add_operator_expression('$and', [{field => value}])
5959
end
6060
else

spec/mongoid/criteria_spec.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3508,6 +3508,23 @@ def self.ages; self; end
35083508
'foo' => 1, '$and' => [{'foo' => 2}], 'bar' => 3)
35093509
end
35103510
end
3511+
3512+
context "when duplicating where conditions" do
3513+
let(:criteria) { Sound.where(active: true).where(active: true) }
3514+
3515+
it 'does not duplicate criteria' do
3516+
expect(criteria.selector).to eq('active' => true)
3517+
end
3518+
end
3519+
3520+
context "when duplicating where conditions with different values" do
3521+
let(:criteria) { Sound.where(active: true).where(active: false).where(active: true).where(active: false) }
3522+
3523+
it 'does not duplicate criteria' do
3524+
expect(criteria.selector).to eq(
3525+
'active' => true, '$and' => [{'active' => false}])
3526+
end
3527+
end
35113528
end
35123529

35133530
describe "#for_js" do

spec/mongoid/scopable_spec.rb

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,17 @@
110110
expect(Band).to be_default_scoping
111111
end
112112
end
113+
114+
context "when parent class has default scope" do
115+
116+
let (:selector) do
117+
AudibleSound.all.selector
118+
end
119+
120+
it "the subclass doesn't duplicate the default scope in the selector" do
121+
expect(selector).to eq({'active' => true})
122+
end
123+
end
113124
end
114125

115126
describe ".default_scopable?" do

spec/support/models/audible_sound.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# frozen_string_literal: true
2+
3+
class AudibleSound < Sound; end

0 commit comments

Comments
 (0)