Module: LikeQuery::ModelExtensions

Defined in:
lib/like_query/model_extensions.rb

Instance Method Summary collapse

Instance Method Details

#generate_hash(output_schema = nil, limit: 50, image: nil, url: nil) ⇒ Object



57
58
59
60
61
# File 'lib/like_query/model_extensions.rb', line 57

def generate_hash(output_schema = nil, limit: 50, image: nil, url: nil)
  c = LikeQuery::Collect.new(limit)
  c.collect(output_schema, limit: limit, image: image, url: url) { all }
  c.generate_hash
end

#generate_json(output_schema = nil, limit: 50, image: nil, url: nil) ⇒ Object



63
64
65
66
67
# File 'lib/like_query/model_extensions.rb', line 63

def generate_json(output_schema = nil, limit: 50, image: nil, url: nil)
  c = LikeQuery::Collect.new(limit)
  c.collect(output_schema, limit: limit, image: image, url: url) { all }
  c.generate_json
end

#like(search_string, schema = nil) ⇒ Object



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

#like_query_schemaObject



69
70
71
# File 'lib/like_query/model_extensions.rb', line 69

def like_query_schema
  @like_query_schema
end