adding any/all support for MetaWhere conditions
This commit is contained in:
		
							parent
							
								
									eb2826f135
								
							
						
					
					
						commit
						9bee4a8d4b
					
				@ -11,7 +11,17 @@ module CanCan
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      def self.matches_condition?(subject, name, value)
 | 
					      def self.matches_condition?(subject, name, value)
 | 
				
			||||||
        subject_value = subject.send(name.column)
 | 
					        subject_value = subject.send(name.column)
 | 
				
			||||||
        case name.method.to_sym
 | 
					        if name.method.to_s.ends_with? "_any"
 | 
				
			||||||
 | 
					          value.any? { |v| meta_where_match? subject_value, name.method.to_s.sub("_any", ""), v }
 | 
				
			||||||
 | 
					        elsif name.method.to_s.ends_with? "_all"
 | 
				
			||||||
 | 
					          value.all? { |v| meta_where_match? subject_value, name.method.to_s.sub("_all", ""), v }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          meta_where_match? subject_value, name.method, value
 | 
				
			||||||
 | 
					        end
 | 
				
			||||||
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      def self.meta_where_match?(subject_value, method, value)
 | 
				
			||||||
 | 
					        case method.to_sym
 | 
				
			||||||
        when :eq      then subject_value == value
 | 
					        when :eq      then subject_value == value
 | 
				
			||||||
        when :not_eq  then subject_value != value
 | 
					        when :not_eq  then subject_value != value
 | 
				
			||||||
        when :in      then value.include?(subject_value)
 | 
					        when :in      then value.include?(subject_value)
 | 
				
			||||||
@ -20,9 +30,9 @@ module CanCan
 | 
				
			|||||||
        when :lteq    then subject_value <= value
 | 
					        when :lteq    then subject_value <= value
 | 
				
			||||||
        when :gt      then subject_value > value
 | 
					        when :gt      then subject_value > value
 | 
				
			||||||
        when :gteq    then subject_value >= value
 | 
					        when :gteq    then subject_value >= value
 | 
				
			||||||
        when :matches then subject_value.downcase.include?(value.downcase)
 | 
					        when :matches then subject_value =~ Regexp.new("^" + Regexp.escape(value).gsub("%", ".*") + "$", true)
 | 
				
			||||||
        when :does_not_match then !subject_value.downcase.include?(value.downcase)
 | 
					        when :does_not_match then !meta_where_match?(subject_value, :matches, value)
 | 
				
			||||||
        else raise NotImplemented, "The #{name.method} MetaWhere condition is not supported."
 | 
					        else raise NotImplemented, "The #{method} MetaWhere condition is not supported."
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -231,6 +231,10 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
 | 
				
			|||||||
      article1 = Article.new(:priority => 1, :name => "Hello World")
 | 
					      article1 = Article.new(:priority => 1, :name => "Hello World")
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.eq, 1).should be_true
 | 
					      adapter.matches_condition?(article1, :priority.eq, 1).should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.eq, 2).should be_false
 | 
					      adapter.matches_condition?(article1, :priority.eq, 2).should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.eq_any, [1, 2]).should be_true
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.eq_any, [2, 3]).should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.eq_all, [1, 1]).should be_true
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.eq_all, [1, 2]).should be_false
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.ne, 2).should be_true
 | 
					      adapter.matches_condition?(article1, :priority.ne, 2).should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.ne, 1).should be_false
 | 
					      adapter.matches_condition?(article1, :priority.ne, 1).should be_false
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.in, [1, 2]).should be_true
 | 
					      adapter.matches_condition?(article1, :priority.in, [1, 2]).should be_true
 | 
				
			||||||
@ -245,10 +249,15 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
 | 
				
			|||||||
      adapter.matches_condition?(article1, :priority.gt, 1).should be_false
 | 
					      adapter.matches_condition?(article1, :priority.gt, 1).should be_false
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.gteq, 1).should be_true
 | 
					      adapter.matches_condition?(article1, :priority.gteq, 1).should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.gteq, 2).should be_false
 | 
					      adapter.matches_condition?(article1, :priority.gteq, 2).should be_false
 | 
				
			||||||
      adapter.matches_condition?(article1, :name.like, "ello worl").should be_true
 | 
					      adapter.matches_condition?(article1, :name.like, "%ello worl%").should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :name.like, "helo").should be_false
 | 
					      adapter.matches_condition?(article1, :name.like, "hello world").should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :name.nlike, "helo").should be_true
 | 
					      adapter.matches_condition?(article1, :name.like, "hello%").should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :name.nlike, "ello worl").should be_false
 | 
					      adapter.matches_condition?(article1, :name.like, "h%d").should be_true
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :name.like, "%helo%").should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :name.like, "hello").should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :name.like, "hello.world").should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :name.nlike, "%helo%").should be_true
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :name.nlike, "%ello worl%").should be_false
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user