Class: Toller::Retriever

Inherits:
Object
  • Object
show all
Defined in:
lib/toller/retriever.rb

Overview

Retriever

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(collection, filter_params, sort_params, retrievals) ⇒ Toller::Retriever

Returns a new instance of Retriever.

Parameters:

  • collection (ActiveRecord::Relation)

    the collection to filter/sort

  • filter_params (Hash)

    the request's filter params

  • sort_params (Array<String>)

    the request's sort params

  • retrievals (Array<Toller::Filter,Toller::Sort>)

    every registered Filter and Sort



38
39
40
41
42
43
# File 'lib/toller/retriever.rb', line 38

def initialize(collection, filter_params, sort_params, retrievals)
  @collection = collection
  @filter_params = filter_params
  @sort_params = sort_params
  @retrievals = retrievals
end

Instance Attribute Details

#collectionActiveRecord::Relation (readonly)

Returns the collection being filtered/sorted.

Returns:

  • (ActiveRecord::Relation)

    the collection being filtered/sorted



8
9
10
# File 'lib/toller/retriever.rb', line 8

def collection
  @collection
end

#filter_paramsHash (readonly)

Returns the request's filter params, keyed by filter parameter name.

Returns:

  • (Hash)

    the request's filter params, keyed by filter parameter name



11
12
13
# File 'lib/toller/retriever.rb', line 11

def filter_params
  @filter_params
end

#retrievalsArray<Toller::Filter,Toller::Sort> (readonly)

Returns every Filter and Sort registered on the including class's ancestor chain.

Returns:



15
16
17
# File 'lib/toller/retriever.rb', line 15

def retrievals
  @retrievals
end

#sort_paramsArray<String> (readonly)

Returns the request's sort params, e.g. ['-published_at', 'title'].

Returns:

  • (Array<String>)

    the request's sort params, e.g. ['-published_at', 'title']



18
19
20
# File 'lib/toller/retriever.rb', line 18

def sort_params
  @sort_params
end

Class Method Details

.filter(collection, filter_params, sort_params, retrievals) ⇒ ActiveRecord::Relation

Builds a Retriever and applies all active filters/sorts to collection.

Parameters:

  • collection (ActiveRecord::Relation)

    the collection to filter/sort

  • filter_params (Hash)

    the request's filter params

  • sort_params (Array<String>)

    the request's sort params

  • retrievals (Array<Toller::Filter,Toller::Sort>)

    every registered Filter and Sort

Returns:

  • (ActiveRecord::Relation)

    the filtered and sorted collection



28
29
30
# File 'lib/toller/retriever.rb', line 28

def self.filter(collection, filter_params, sort_params, retrievals)
  new(collection, filter_params, sort_params, retrievals).filter
end

Instance Method Details

#filterActiveRecord::Relation

Reduces over the active filters/sorts, chaining each one's apply! onto the collection returned by the previous one.

Returns:

  • (ActiveRecord::Relation)

    the filtered and sorted collection



50
51
52
53
54
55
56
57
58
59
60
# File 'lib/toller/retriever.rb', line 50

def filter
  active_retrievals.reduce(collection) do |items, retrieval|
    param_value = if retrieval.is_a?(Filter)
                    filter_params.fetch(retrieval.parameter, nil)
                  else
                    sort_params.include?("-#{retrieval.parameter}") ? :desc : :asc
                  end

    retrieval.apply!(items, param_value)
  end
end