diff --git a/lib/ransack/search.rb b/lib/ransack/search.rb index 03115c5a..edea3362 100644 --- a/lib/ransack/search.rb +++ b/lib/ransack/search.rb @@ -27,6 +27,14 @@ def initialize(object, params = {}, options = {}) params = params.dup params = params.transform_values { |v| v.is_a?(String) && strip_whitespace ? v.strip : v } params.delete_if { |k, v| [*v].all?{ |i| i.blank? && i != false } } + if params.key?(:c) + case params[:c] + when Array + params[:c].delete_if { |v| check_advanced_search_value? v } + when Hash + params[:c].delete_if { |_,v| check_advanced_search_value? v } + end + end else params = {} end @@ -191,5 +199,13 @@ def collapse_multiparameter_attributes!(attrs) attrs end + def check_advanced_search_value?(value) + case value[:v] + when Array + value[:v].all?{ |i| i.blank? && i != false } + when Hash + value[:v].all?{ |_,i| value[:value].blank? && value[:value] != false } + end + end end end diff --git a/spec/ransack/adapters/active_record/base_spec.rb b/spec/ransack/adapters/active_record/base_spec.rb index ff7d0fab..c378343e 100644 --- a/spec/ransack/adapters/active_record/base_spec.rb +++ b/spec/ransack/adapters/active_record/base_spec.rb @@ -362,6 +362,17 @@ def self.sane_adapter? expect(s.result.to_sql).not_to match /LEFT OUTER JOIN/ end + it 'should remove empty key value pairs from the complex params hash' do + s = Person.ransack( + c: { + '0' => { + a: ['children_name'], + p: 'eq', v: [''] + } + }) + expect(s.result.to_sql).not_to match /LEFT OUTER JOIN/ + end + it 'should keep proper key value pairs in the params hash' do s = Person.ransack(children_reversed_name_eq: 'Testing') expect(s.result.to_sql).to match /LEFT OUTER JOIN/