From 511e0ac8244f9f69baa244e69f330dd62232b2b4 Mon Sep 17 00:00:00 2001 From: Nicolas Rodriguez Date: Tue, 15 May 2018 07:28:33 +0200 Subject: [PATCH] We should use formatted_value when checking for searchable integers --- .../datatable/column/search.rb | 6 +++--- .../orm/active_record_filter_records_spec.rb | 17 +++++++++++++++++ spec/support/datatable_cond_numeric.rb | 10 ++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/ajax-datatables-rails/datatable/column/search.rb b/lib/ajax-datatables-rails/datatable/column/search.rb index a6280892..1b85a046 100644 --- a/lib/ajax-datatables-rails/datatable/column/search.rb +++ b/lib/ajax-datatables-rails/datatable/column/search.rb @@ -90,11 +90,11 @@ def empty_search end def is_searchable_integer? - if search.value.is_a?(Array) - valids = search.value.map { |v| is_integer?(v) && !is_out_of_range?(v) } + if formated_value.is_a?(Array) + valids = formated_value.map { |v| is_integer?(v) && !is_out_of_range?(v) } !valids.include?(false) else - is_integer?(search.value) && !is_out_of_range?(search.value) + is_integer?(formated_value) && !is_out_of_range?(formated_value) end end diff --git a/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb b/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb index 104988e1..1950930a 100644 --- a/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb +++ b/spec/ajax-datatables-rails/orm/active_record_filter_records_spec.rb @@ -495,6 +495,23 @@ end end + describe 'it can filter records with condition :in with regex' do + let(:datatable) { DatatableCondInWithRegex.new(view) } + + before(:each) do + create(:user, first_name: 'john', post_id: 1) + create(:user, first_name: 'mary', post_id: 2) + end + + it 'should filter records matching' do + datatable.params[:columns]['4'][:search][:value] = '1|2' + datatable.params[:order]['0'] = { column: '4', dir: 'asc' } + expect(datatable.data.size).to eq 2 + item = datatable.data.first + expect(item[:first_name]).to eq 'john' + end + end + describe 'Integer overflows' do let(:datatable) { DatatableCondEq.new(view) } let(:largest_postgresql_integer_value) { 2147483647 } diff --git a/spec/support/datatable_cond_numeric.rb b/spec/support/datatable_cond_numeric.rb index 7832bc11..e840ab5d 100644 --- a/spec/support/datatable_cond_numeric.rb +++ b/spec/support/datatable_cond_numeric.rb @@ -39,3 +39,13 @@ def view_columns super.deep_merge(post_id: { cond: :in }) end end + +class DatatableCondInWithRegex < DatatableCondIn + def view_columns + super.deep_merge(post_id: { cond: :in, use_regex: false, orderable: true, formater: ->(str) { cast_regex_value(str) } }) + end + + def cast_regex_value(value) + value.split('|').map(&:to_i) + end +end