adding more MetaWhere comparison operators
This commit is contained in:
		
							parent
							
								
									a49269175e
								
							
						
					
					
						commit
						eb2826f135
					
				@ -11,9 +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
 | 
					        case name.method.to_sym
 | 
				
			||||||
        when "lt" then subject_value < value
 | 
					        when :eq      then subject_value == value
 | 
				
			||||||
        when "gt" then subject_value > value
 | 
					        when :not_eq  then subject_value != value
 | 
				
			||||||
 | 
					        when :in      then value.include?(subject_value)
 | 
				
			||||||
 | 
					        when :not_in  then !value.include?(subject_value)
 | 
				
			||||||
 | 
					        when :lt      then subject_value < value
 | 
				
			||||||
 | 
					        when :lteq    then subject_value <= value
 | 
				
			||||||
 | 
					        when :gt      then subject_value > value
 | 
				
			||||||
 | 
					        when :gteq    then subject_value >= value
 | 
				
			||||||
 | 
					        when :matches then subject_value.downcase.include?(value.downcase)
 | 
				
			||||||
 | 
					        when :does_not_match then !subject_value.downcase.include?(value.downcase)
 | 
				
			||||||
        else raise NotImplemented, "The #{name.method} MetaWhere condition is not supported."
 | 
					        else raise NotImplemented, "The #{name.method} MetaWhere condition is not supported."
 | 
				
			||||||
        end
 | 
					        end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
				
			|||||||
@ -19,6 +19,7 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    with_model :article do
 | 
					    with_model :article do
 | 
				
			||||||
      table do |t|
 | 
					      table do |t|
 | 
				
			||||||
 | 
					        t.string  "name"
 | 
				
			||||||
        t.boolean "published"
 | 
					        t.boolean "published"
 | 
				
			||||||
        t.boolean "secret"
 | 
					        t.boolean "secret"
 | 
				
			||||||
        t.integer "priority"
 | 
					        t.integer "priority"
 | 
				
			||||||
@ -227,11 +228,27 @@ if ENV["MODEL_ADAPTER"].nil? || ENV["MODEL_ADAPTER"] == "active_record"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    it "should match any MetaWhere condition" do
 | 
					    it "should match any MetaWhere condition" do
 | 
				
			||||||
      adapter = CanCan::ModelAdapters::ActiveRecordAdapter
 | 
					      adapter = CanCan::ModelAdapters::ActiveRecordAdapter
 | 
				
			||||||
      article1 = Article.new(:priority => 1)
 | 
					      article1 = Article.new(:priority => 1, :name => "Hello World")
 | 
				
			||||||
 | 
					      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.ne, 2).should be_true
 | 
				
			||||||
 | 
					      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, [2, 3]).should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.nin, [2, 3]).should be_true
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.nin, [1, 2]).should be_false
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.lt, 2).should be_true
 | 
					      adapter.matches_condition?(article1, :priority.lt, 2).should be_true
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.lt, 1).should be_false
 | 
					      adapter.matches_condition?(article1, :priority.lt, 1).should be_false
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.lteq, 1).should be_true
 | 
				
			||||||
 | 
					      adapter.matches_condition?(article1, :priority.lteq, 0).should be_false
 | 
				
			||||||
      adapter.matches_condition?(article1, :priority.gt, 0).should be_true
 | 
					      adapter.matches_condition?(article1, :priority.gt, 0).should be_true
 | 
				
			||||||
      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, 2).should be_false
 | 
				
			||||||
 | 
					      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.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