class Rails::Surrender::SortBuilder

apply sort directives to the given resource, based on the given sort controls

Attributes

resource[R]
sort[R]

Public Class Methods

new(resource:, sort:) click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 9
def initialize(resource:, sort:)
  @resource = resource
  @sort = sort
end

Public Instance Methods

build!() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 14
def build!
  return resource unless resource.is_a? ActiveRecord::Relation

  return resource_attribute_order if resource_has_attribute?

  return scope_method_order if resource_has_scope_method?

  return association_attribute_order if resource_has_association_with_attribute?

  raise Error, I18n.t('surrender.error.query_string.sort.invalid_column', param: sort.request)
end

Private Instance Methods

association_attribute_order() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 49
def association_attribute_order
  table_name = resource.reflect_on_association(sort.association).klass.table_name
  resource.joins(sort.association.to_sym)
          .order("#{table_name}.#{sort.attribute} #{sort.direction}")
end
resource_attribute_order() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 32
def resource_attribute_order
  resource.order(sort.attribute => sort.direction)
end
resource_has_association_with_attribute?() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 44
def resource_has_association_with_attribute?
  resource.reflections.keys.include?(sort.association) &&
    resource.reflect_on_association(sort.association).klass.attribute_names.include?(sort.attribute)
end
resource_has_attribute?() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 28
def resource_has_attribute?
  resource.klass.attribute_names.include?(sort.attribute)
end
resource_has_scope_method?() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 36
def resource_has_scope_method?
  resource.respond_to?(sort.scope_method)
end
scope_method_order() click to toggle source
# File lib/rails/surrender/helpers/sort_builder.rb, line 40
def scope_method_order
  resource.send(sort.scope_method, sort.direction)
end