Skip to content

Commit ea5847e

Browse files
committed
Extract Column search module
1 parent 4737032 commit ea5847e

File tree

3 files changed

+91
-75
lines changed

3 files changed

+91
-75
lines changed

lib/ajax-datatables-rails/datatable/column.rb

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class Column
1616
attr_reader :datatable, :index, :options
1717
attr_writer :search
1818

19+
include Search
20+
1921
unless AjaxDatatablesRails.old_rails?
2022
prepend DateFilter
2123
end
@@ -31,30 +33,10 @@ def data
3133
options[:data].presence || options[:name]
3234
end
3335

34-
def searchable?
35-
@view_column.fetch(:searchable, true)
36-
end
37-
3836
def orderable?
3937
@view_column.fetch(:orderable, true)
4038
end
4139

42-
def search
43-
@search ||= SimpleSearch.new(options[:search])
44-
end
45-
46-
def searched?
47-
search.value.present?
48-
end
49-
50-
def cond
51-
@view_column[:cond] || :like
52-
end
53-
54-
def filter
55-
@view_column[:cond].call(self, formated_value)
56-
end
57-
5840
def source
5941
@view_column[:source]
6042
end
@@ -70,11 +52,6 @@ def formater
7052
@view_column[:formater]
7153
end
7254

73-
# Add use_regex option to allow bypassing of regex search
74-
def use_regex?
75-
@view_column.fetch(:use_regex, true)
76-
end
77-
7855
def table
7956
model = source.split('.').first.constantize
8057
model.arel_table rescue model
@@ -84,10 +61,6 @@ def field
8461
source.split('.').last.to_sym
8562
end
8663

87-
def search_query
88-
search.regexp? ? regex_search : non_regex_search
89-
end
90-
9164
def sort_query
9265
custom_field? ? source : "#{table.name}.#{sort_field}"
9366
end
@@ -106,36 +79,6 @@ def config
10679
@config ||= AjaxDatatablesRails.config
10780
end
10881

109-
# Using multi-select filters in JQuery Datatable auto-enables regex_search.
110-
# Unfortunately regex_search doesn't work when filtering on primary keys with integer.
111-
# It generates this kind of query : AND ("regions"."id" ~ '2|3') which throws an error :
112-
# operator doesn't exist : integer ~ unknown
113-
# The solution is to bypass regex_search and use non_regex_search with :in operator
114-
def regex_search
115-
if use_regex?
116-
::Arel::Nodes::Regexp.new((custom_field? ? field : table[field]), ::Arel::Nodes.build_quoted(formated_value))
117-
else
118-
non_regex_search
119-
end
120-
end
121-
122-
def non_regex_search
123-
case cond
124-
when Proc
125-
filter
126-
when :eq, :not_eq, :lt, :gt, :lteq, :gteq, :in
127-
numeric_search
128-
when :null_value
129-
null_value_search
130-
when :start_with
131-
casted_column.matches("#{formated_value}%")
132-
when :end_with
133-
casted_column.matches("%#{formated_value}")
134-
when :like
135-
casted_column.matches("%#{formated_value}%")
136-
end
137-
end
138-
13982
def typecast
14083
DB_ADAPTER_TYPE_CAST[config.db_adapter] || 'VARCHAR'
14184
end
@@ -144,22 +87,6 @@ def casted_column
14487
::Arel::Nodes::NamedFunction.new('CAST', [table[field].as(typecast)])
14588
end
14689

147-
def null_value_search
148-
if formated_value == '!NULL'
149-
table[field].not_eq(nil)
150-
else
151-
table[field].eq(nil)
152-
end
153-
end
154-
155-
def numeric_search
156-
if custom_field?
157-
::Arel::Nodes::SqlLiteral.new(field).eq(formated_value)
158-
else
159-
table[field].send(cond, formated_value)
160-
end
161-
end
162-
16390
end
16491
end
16592
end
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# frozen_string_literal: true
2+
3+
module AjaxDatatablesRails
4+
module Datatable
5+
class Column
6+
module Search
7+
8+
def searchable?
9+
@view_column.fetch(:searchable, true)
10+
end
11+
12+
def cond
13+
@view_column[:cond] || :like
14+
end
15+
16+
def filter
17+
@view_column[:cond].call(self, formated_value)
18+
end
19+
20+
def search
21+
@search ||= SimpleSearch.new(options[:search])
22+
end
23+
24+
def searched?
25+
search.value.present?
26+
end
27+
28+
def search_query
29+
search.regexp? ? regex_search : non_regex_search
30+
end
31+
32+
# Add use_regex option to allow bypassing of regex search
33+
def use_regex?
34+
@view_column.fetch(:use_regex, true)
35+
end
36+
37+
private
38+
39+
# Using multi-select filters in JQuery Datatable auto-enables regex_search.
40+
# Unfortunately regex_search doesn't work when filtering on primary keys with integer.
41+
# It generates this kind of query : AND ("regions"."id" ~ '2|3') which throws an error :
42+
# operator doesn't exist : integer ~ unknown
43+
# The solution is to bypass regex_search and use non_regex_search with :in operator
44+
def regex_search
45+
if use_regex?
46+
::Arel::Nodes::Regexp.new((custom_field? ? field : table[field]), ::Arel::Nodes.build_quoted(formated_value))
47+
else
48+
non_regex_search
49+
end
50+
end
51+
52+
def non_regex_search
53+
case cond
54+
when Proc
55+
filter
56+
when :eq, :not_eq, :lt, :gt, :lteq, :gteq, :in
57+
numeric_search
58+
when :null_value
59+
null_value_search
60+
when :start_with
61+
casted_column.matches("#{formated_value}%")
62+
when :end_with
63+
casted_column.matches("%#{formated_value}")
64+
when :like
65+
casted_column.matches("%#{formated_value}%")
66+
end
67+
end
68+
69+
def null_value_search
70+
if formated_value == '!NULL'
71+
table[field].not_eq(nil)
72+
else
73+
table[field].eq(nil)
74+
end
75+
end
76+
77+
def numeric_search
78+
if custom_field?
79+
::Arel::Nodes::SqlLiteral.new(field).eq(formated_value)
80+
else
81+
table[field].send(cond, formated_value)
82+
end
83+
end
84+
85+
end
86+
end
87+
end
88+
end

lib/ajax_datatables_rails.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module AjaxDatatablesRails
77
require 'ajax-datatables-rails/datatable/datatable'
88
require 'ajax-datatables-rails/datatable/simple_search'
99
require 'ajax-datatables-rails/datatable/simple_order'
10+
require 'ajax-datatables-rails/datatable/column/search'
1011
require 'ajax-datatables-rails/datatable/column/date_filter' unless AjaxDatatablesRails.old_rails?
1112
require 'ajax-datatables-rails/datatable/column'
1213
require 'ajax-datatables-rails/orm/active_record'

0 commit comments

Comments
 (0)