class Tire::Search::MultiSort

EXAMPLE of using:

multi_sort sort, order do

by_default :premium

by :date
by :rating,    invert(order)

by :name,      :title
by :rating,    :licensee_rating
by :relevance, :_score
by :category,  :category_name
by :distance,  :_geo_distance, location: "test", unit: 'mi'
by :premium,   :premium, :desc

by_collection  :category,  [:category, :name]
by_collection  :premium,   [:premium, :relevance, :name]

end

Public Class Methods

new(sort_param, order, &block) click to toggle source
Calls superclass method
# File lib/tire-multisort/tire/search/multi_sort.rb, line 30
def initialize(sort_param, order, &block)
  @collections = {}
  @fields = {}

  super(&block)

  @sort = sort_by(sort_param)
  @order = order
  fields_with_order.each { |opts| origin_by *opts }
end

Public Instance Methods

by(sort, *options) click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 53
def by(sort, *options)
  if options.blank? || [:desc, :asc].include?(options.first)
    @fields[sort] = options.unshift(sort)
  else
    @fields[sort] = options
  end
end
Also aliased as: origin_by
by_collection(sort, collection) click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 45
def by_collection(sort, collection)
  if collection.is_a? Array
    @collections[sort] = collection
  else
    raise ArgumentError, "expect Array (got #{collection.class}) for collection param"
  end
end
by_default(sort_param) click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 41
def by_default(sort_param)
  @default = sort_by(sort_param)
end
invert(order) click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 61
def invert(order)
  order.to_s == 'asc' ? :desc : :asc
end
origin_by(sort, *options)
Alias for: by

Private Instance Methods

add_order_to_field(field) click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 67
def add_order_to_field(field)
  if field.size == 1
    field.push @order
  elsif field.last.is_a?(Hash) && !field.last.has_key?(:order)
    field.last.merge!(order: @order)
  end

  field
end
collections() click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 87
def collections
  @sort.size == 1 ? (@collections[@sort.first] || @sort) : @sort
end
fields() click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 83
def fields
  collections.map { |name| @fields[name.to_sym] }.compact
end
fields_with_order() click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 77
def fields_with_order
  @sort = @default if fields.empty?

  fields.map { |field| add_order_to_field field.dup }
end
sort_by(param) click to toggle source
# File lib/tire-multisort/tire/search/multi_sort.rb, line 91
def sort_by(param)
  param.to_s.split(',').map { |s| s.strip.to_sym }
end