Ensure conditions differing only by ransacker_args aren't filtered out by uniq\!

This commit is contained in:
Andrew Porterfield 2016-04-27 14:26:42 -04:00
parent ae6d58cba5
commit 6094adca47
2 changed files with 46 additions and 1 deletions

View File

@ -44,7 +44,7 @@ module Ransack
self.conditions << condition if condition.valid?
end
end
self.conditions.uniq!
remove_duplicate_conditions!
end
alias :c= :conditions=
@ -195,6 +195,17 @@ module Ransack
Predicate.detect_and_strip_from_string!(string)
string
end
def remove_duplicate_conditions!
# If self.conditions.uniq! is called without passing a block, then
# conditions differing only by ransacker_args within attributes are
# wrongly considered equal and are removed.
self.conditions.uniq! do |c|
c.attributes.map { |a| [a.name, a.ransacker_args] }.flatten +
[c.predicate.name] +
c.values.map { |v| v.value }
end
end
end
end
end

View File

@ -50,6 +50,40 @@ module Ransack
end
end
describe '#conditions=' do
let(:conditions) do
{
"0"=>{
"a"=>{"0"=>{"name"=>"name", "ransacker_args"=>""}}, "p"=>"cont", "v"=>{"0"=>{"value"=>"John"}}
},
"1"=>{
"a"=>{"0"=>{"name"=>"name", "ransacker_args"=>""}}, "p"=>"cont", "v"=>{"0"=>{"value"=>"John"}}
}
}
end
before { subject.conditions = conditions }
it 'removes duplicates' do
expect(subject.conditions.count).to eq 1
end
context 'when conditions differ only by ransacker_args' do
let(:conditions) do
{
"0"=>{
"a"=>{"0"=>{"name"=>"with_arguments", "ransacker_args"=>[1,2]}}, "p"=>"eq", "v"=>{"0"=>{"value"=>"10"}}
},
"1"=>{
"a"=>{"0"=>{"name"=>"with_arguments", "ransacker_args"=>[3,4]}}, "p"=>"eq", "v"=>{"0"=>{"value"=>"10"}}
}
}
end
it "doesn't consider them duplicates" do
expect(subject.conditions.count).to eq 2
end
end
end
end
end
end