From 4a439d72d61d440ae022375af5ebe6b9bcc533e2 Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Wed, 6 Jan 2021 19:22:21 +0000 Subject: [PATCH 1/3] Support multiple exclusions Since it does a not of numeric_attribute_matches which uses the post query builder, it now also support reverse ranges and reverse greater/less than. --- app/logical/concerns/searchable.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/logical/concerns/searchable.rb b/app/logical/concerns/searchable.rb index b1f9610b6..b40f57f90 100644 --- a/app/logical/concerns/searchable.rb +++ b/app/logical/concerns/searchable.rb @@ -206,6 +206,8 @@ module Searchable def search_numeric_attribute(attr, params) if params[attr].present? numeric_attribute_matches(attr, params[attr]) + elsif params[:"#{attr}_not"].present? + where.not(id: numeric_attribute_matches(attr, params[:"#{attr}_not"])) elsif params[:"#{attr}_eq"].present? where_operator(attr, :eq, params[:"#{attr}_eq"]) elsif params[:"#{attr}_not_eq"].present? From 57de81686bc1ded2818501d3d18ad6ce864b544d Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Wed, 6 Jan 2021 19:46:24 +0000 Subject: [PATCH 2/3] Support using all numeric searches for includes --- app/logical/concerns/searchable.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/logical/concerns/searchable.rb b/app/logical/concerns/searchable.rb index b40f57f90..d2b4a0baa 100644 --- a/app/logical/concerns/searchable.rb +++ b/app/logical/concerns/searchable.rb @@ -10,6 +10,10 @@ module Searchable 1 + params.values.map { |v| parameter_hash?(v) ? parameter_depth(v) : 1 }.max end + def prefix_matches(prefix, params) + params.keys.any? { |x| x.starts_with?(prefix) } + end + def negate_relation unscoped.where(all.where_clause.invert.ast) end @@ -279,7 +283,7 @@ module Searchable def search_includes(attr, params, type, current_user) model = Kernel.const_get(type) - if params["#{attr}_id"].present? + if prefix_matches("#{attr}_id", params) search_attribute("#{attr}_id", params, current_user) elsif params["has_#{attr}"].to_s.truthy? || params["has_#{attr}"].to_s.falsy? search_has_include(attr, params["has_#{attr}"].to_s.truthy?, model) From db5f9ce243b382d178661874e9b7b8ed545db09b Mon Sep 17 00:00:00 2001 From: BrokenEagle Date: Wed, 6 Jan 2021 20:14:28 +0000 Subject: [PATCH 3/3] Support multiple excludes for enum types It's not possible to pass it off to search_numeric_attribute directly since the column "category" does not match the prefix "category_id". --- app/logical/concerns/searchable.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/logical/concerns/searchable.rb b/app/logical/concerns/searchable.rb index d2b4a0baa..245de2545 100644 --- a/app/logical/concerns/searchable.rb +++ b/app/logical/concerns/searchable.rb @@ -329,6 +329,8 @@ module Searchable relation = relation.where(name => value) elsif params["#{name}_id"].present? relation = relation.numeric_attribute_matches(name, params["#{name}_id"]) + elsif params["#{name}_id_not"].present? + relation = relation.where.not(id: relation.numeric_attribute_matches(name, params["#{name}_id_not"])) end relation