From 3df134e08e798d077155e24005138d4b6d1bdfd5 Mon Sep 17 00:00:00 2001 From: Andrew Vit Date: Sat, 2 Jan 2016 10:49:13 -0800 Subject: [PATCH] Tell if a condition is negative --- lib/ransack/nodes/condition.rb | 4 ++++ lib/ransack/predicate.rb | 4 ++++ spec/ransack/nodes/condition_spec.rb | 9 +++++++++ 3 files changed, 17 insertions(+) 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(