diff --git a/lib/rails_admin/adapters/active_record.rb b/lib/rails_admin/adapters/active_record.rb index e7384cbf7f..732c705fdf 100644 --- a/lib/rails_admin/adapters/active_record.rb +++ b/lib/rails_admin/adapters/active_record.rb @@ -201,17 +201,17 @@ def build_statement(column, type, value, operator) return if value.blank? value = case operator when 'default', 'like' - "%#{value}%" + "%#{value.downcase}%" when 'starts_with' - "#{value}%" + "#{value.downcase}%" when 'ends_with' - "%#{value}" + "%#{value.downcase}" when 'is', '=' - "#{value}" + "#{value.downcase}" else return end - ["(#{column} #{like_operator} ?)", value] + ["(LOWER(#{column}) #{like_operator} ?)", value] when :date start_date, end_date = get_filtering_duration(operator, value) diff --git a/spec/unit/adapters/active_record_spec.rb b/spec/unit/adapters/active_record_spec.rb index 6add0920c4..65a6ebbed6 100644 --- a/spec/unit/adapters/active_record_spec.rb +++ b/spec/unit/adapters/active_record_spec.rb @@ -153,8 +153,8 @@ class ARComment < ActiveRecord::Base expect(param[:primary_key_proc].call).to eq('id') expect(param[:model_proc].call).to eq(ARComment) end - - + + it 'has correct opposite model lookup for polymorphic associations' do RailsAdmin::Config.stub!(:models_pool).and_return(["ARBlog", "ARPost", "ARCategory", "ARUser", "ARProfile", "ARComment"]) expect(@category.associations.find{|a| a[:name] == :librarian}[:model_proc].call).to eq [ARUser] @@ -362,13 +362,17 @@ class ARComment < ActiveRecord::Base it "supports string type query" do expect(@abstract_model.send(:build_statement, :field, :string, "", nil)).to be_nil expect(@abstract_model.send(:build_statement, :field, :string, "foo", "was")).to be_nil - expect(@abstract_model.send(:build_statement, :field, :string, "foo", "default")).to eq(["(field #{@like} ?)", "%foo%"]) - expect(@abstract_model.send(:build_statement, :field, :string, "foo", "like")).to eq(["(field #{@like} ?)", "%foo%"]) - expect(@abstract_model.send(:build_statement, :field, :string, "foo", "starts_with")).to eq(["(field #{@like} ?)", "foo%"]) - expect(@abstract_model.send(:build_statement, :field, :string, "foo", "ends_with")).to eq(["(field #{@like} ?)", "%foo"]) - expect(@abstract_model.send(:build_statement, :field, :string, "foo", "is")).to eq(["(field #{@like} ?)", "foo"]) + expect(@abstract_model.send(:build_statement, :field, :string, "foo", "default")).to eq(["(LOWER(field) #{@like} ?)", "%foo%"]) + expect(@abstract_model.send(:build_statement, :field, :string, "foo", "like")).to eq(["(LOWER(field) #{@like} ?)", "%foo%"]) + expect(@abstract_model.send(:build_statement, :field, :string, "foo", "starts_with")).to eq(["(LOWER(field) #{@like} ?)", "foo%"]) + expect(@abstract_model.send(:build_statement, :field, :string, "foo", "ends_with")).to eq(["(LOWER(field) #{@like} ?)", "%foo"]) + expect(@abstract_model.send(:build_statement, :field, :string, "foo", "is")).to eq(["(LOWER(field) #{@like} ?)", "foo"]) end + it "performs case-insensitive searches" do + expect(@abstract_model.send(:build_statement, :field, :string, "foo", "default")).to eq(["(LOWER(field) #{@like} ?)", "%foo%"]) + expect(@abstract_model.send(:build_statement, :field, :string, "FOO", "default")).to eq(["(LOWER(field) #{@like} ?)", "%foo%"]) + end it "supports date type query" do expect(@abstract_model.send(:filter_conditions, { "date_field" => { "1" => { :v => ["", "01/02/2012", "01/03/2012"], :o => 'between' } } })).to eq(["((field_tests.date_field BETWEEN ? AND ?))", Date.new(2012,1,2), Date.new(2012,1,3)])