Class: Kadmin::Finder

Inherits:
Object
  • Object
show all
Defined in:
lib/kadmin/finder.rb

Defined Under Namespace

Classes: Filter

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(scope) ⇒ Finder

Returns a new instance of Finder.

Parameters:

  • scope (ActiveRecord::Relation)

    base relation to page/filter on



16
17
18
19
20
21
# File 'lib/kadmin/finder.rb', line 16

def initialize(scope)
  @scope = scope
  @pager = nil
  @filters = {}
  @results = nil
end

Instance Attribute Details

#filtersArray<Kadmin::Finder::Filter> (readonly)

Returns array of filters applied to the finder.

Returns:



7
8
9
# File 'lib/kadmin/finder.rb', line 7

def filters
  @filters
end

#pagerKadmin::Pager (readonly)

Returns the pager to use (if any).

Returns:



4
5
6
# File 'lib/kadmin/finder.rb', line 4

def pager
  @pager
end

#scopeActiveRecord::Relation (readonly)

Returns the base relation to find items from.

Returns:

  • (ActiveRecord::Relation)

    the base relation to find items from



10
11
12
# File 'lib/kadmin/finder.rb', line 10

def scope
  @scope
end

Instance Method Details

#filter(name:, column:, value:) ⇒ Object

Parameters:

  • name (String)

    the filter name (should be unique)

  • column (String, Array<String>)

    the column(s) name to filter on

  • value (String, Array<String>)

    the value or values to look for (OR'd)



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/kadmin/finder.rb', line 26

def filter(name:, column:, value:)
  if column.present? && !@filters.key?(name)
    @filters[name] = Kadmin::Finder::Filter.new(column, value)
    if value.present?
      @scope = @scope.where("#{@scope.table_name}.`#{column}` LIKE ?", value.tr('*', '%'))
      @pager&.total = @scope.count
    end
  end

  return self
end

#find!Object



61
62
63
64
# File 'lib/kadmin/finder.rb', line 61

def find!
  @results = nil
  return results
end

#paginate(offset: nil, size: nil) ⇒ Kadmin::Finder

Returns itself.

Parameters:

  • offset (Integer) (defaults to: nil)

    optional; offset/index for the current page

  • size (Integer) (defaults to: nil)

    optional; size of a page

Returns:



41
42
43
44
45
46
47
48
49
50
# File 'lib/kadmin/finder.rb', line 41

def paginate(offset: nil, size: nil)
  offset = offset.to_i
  size = size.to_i

  if size.positive? && offset >= 0
    @pager = Kadmin::Pager.new(size: size, offset: offset)
  end

  return self
end

#resultsActiveRecord::Relation

Returns the filtered (and optionally paginated) results.

Returns:

  • (ActiveRecord::Relation)

    the filtered (and optionally paginated) results



53
54
55
56
57
58
59
# File 'lib/kadmin/finder.rb', line 53

def results
  return @results ||= begin
    results = @scope
    results = @pager.page(results) unless @pager.nil?
    results
  end
end