binarylogic / searchlogic

Searchlogic provides object based searching, common named scopes, and other useful tools.
http://rdoc.info/projects/binarylogic/searchlogic
MIT License
1.39k stars 133 forks source link

does_not_equal Cannot Handle Ranges, Arrays #71

Open skaczor opened 14 years ago

skaczor commented 14 years ago

This is not handled by ActiveRecord named scopes, so I borrowed some code from ActiveRecord::Base.attribute_condition to make it work. Here is the patch:

more 0001-Added-support-for-ranges-and-arrays-when-using-does_.patch
From 33330f47c4d75c9b03331b04583b9f74898044cc Mon Sep 17 00:00:00 2001
From: Simon Kaczor 
Date: Thu, 4 Mar 2010 15:13:55 -0500
Subject: [PATCH] Added support for ranges and arrays when using does_not_equal condition

---
 lib/searchlogic/named_scopes/conditions.rb |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/lib/searchlogic/named_scopes/conditions.rb b/lib/searchlogic/named_scopes/conditions.rb
index 4e24de4..2155ed7 100644
--- a/lib/searchlogic/named_scopes/conditions.rb
+++ b/lib/searchlogic/named_scopes/conditions.rb
@@ -114,7 +114,16 @@ module Searchlogic
           when /^equals/
             scope_options(condition, column_type, lambda { |a| attribute_condition("#{table_name}.#{column}", a) })
           when /^does_not_equal/
-            scope_options(condition, column_type, "#{table_name}.#{column} != ?")
+            scope_options(condition, column_type, lambda do |a|
+              case a
+              when Array
+                "#{table_name}.#{column} NOT IN (?)"
+              when Range
+                "#{table_name}.#{column} NOT BETWEEN ? AND ?"
+              else
+                "#{table_name}.#{column} != ?"
+              end
+            end)
           when /^less_than_or_equal_to/
             scope_options(condition, column_type, "#{table_name}.#{column} <= ?")
           when /^less_than/
--
1.6.3.3