4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'lib/like_query/model_extensions.rb', line 4
def like(search_string, schema = nil)
raise 'like can only be called from a model' if self == ApplicationRecord
queries = nil
associations = []
schema = [schema] if schema.is_a?(Symbol)
@like_query_schema = schema
(search_string.is_a?(String) ? search_string.split(' ') : search_string).each do |s|
str = "%#{s}%"
q = nil
if schema.first.is_a?(Array) && schema.length >= 2
raise "only one array can be given: Either schema as one array or as multiple args, not as array"
end
(schema.first.is_a?(Array) ? schema.first : schema).each do |p|
if p.is_a?(Symbol) || p.is_a?(String)
_q = arel_table[p].matches(str)
q = (q ? q.or(_q) : _q)
elsif p.is_a?(Hash)
p.each do |k, v|
assoc = reflect_on_association(k)
raise "Unknown association: :#{k}" unless assoc.present?
associations.push(k.to_sym) unless associations.include?(k.to_sym)
if v.is_a?(Symbol) || v.is_a?(String)
_q = assoc.klass.arel_table[v].matches(str)
q = (q ? q.or(_q) : _q)
elsif v.is_a?(Array)
v.each do |_v|
_q = assoc.klass.arel_table[_v].matches(str)
q = (q ? q.or(_q) : _q)
end
else
raise "unknown element: #{p}"
end
end
end
end
queries = (queries ? queries.and(q) : q)
end
if associations.present?
left_outer_joins(associations).where(
queries
)
else
where(
queries
)
end
end
|