diff --git a/lib/ransack/nodes/condition.rb b/lib/ransack/nodes/condition.rb index ab09ecf..1fe3f28 100644 --- a/lib/ransack/nodes/condition.rb +++ b/lib/ransack/nodes/condition.rb @@ -247,6 +247,10 @@ module Ransack "Condition <#{data}>" end + def negative? + predicate.negative? + end + private def valid_combinator? diff --git a/lib/ransack/predicate.rb b/lib/ransack/predicate.rb index 2b5bd5d..9357294 100644 --- a/lib/ransack/predicate.rb +++ b/lib/ransack/predicate.rb @@ -74,5 +74,9 @@ module Ransack vals.any? { |v| validator.call(type ? v.cast(type) : v.value) } end + def negative? + @name.include?("not_".freeze) + end + end end diff --git a/spec/ransack/nodes/condition_spec.rb b/spec/ransack/nodes/condition_spec.rb index 6cb728d..8520fd8 100644 --- a/spec/ransack/nodes/condition_spec.rb +++ b/spec/ransack/nodes/condition_spec.rb @@ -29,6 +29,15 @@ module Ransack specify { expect(subject.values.size).to eq(2) } end + describe '#negative?' do + let(:context) { Context.for(Person) } + let(:eq) { Condition.extract(context, 'name_eq', 'A') } + let(:not_eq) { Condition.extract(context, 'name_not_eq', 'A') } + + specify { expect(not_eq.negative?).to be true } + specify { expect(eq.negative?).to be false } + end + context 'with an invalid predicate' do subject { Condition.extract(