class Administrate::Order

Attributes

attribute[R]
direction[R]

Public Class Methods

new(attribute = nil, direction = nil) click to toggle source
# File lib/administrate/order.rb, line 3
def initialize(attribute = nil, direction = nil)
  @attribute = attribute
  @direction = sanitize_direction(direction)
end

Public Instance Methods

apply(relation) click to toggle source
# File lib/administrate/order.rb, line 8
def apply(relation)
  return order_by_association(relation) unless
    reflect_association(relation).nil?

  order = "#{relation.table_name}.#{attribute} #{direction}"

  return relation.reorder(Arel.sql(order)) if
    relation.columns_hash.keys.include?(attribute.to_s)

  relation
end
order_params_for(attr) click to toggle source
# File lib/administrate/order.rb, line 24
def order_params_for(attr)
  {
    order: attr,
    direction: reversed_direction_param_for(attr)
  }
end
ordered_by?(attr) click to toggle source
# File lib/administrate/order.rb, line 20
def ordered_by?(attr)
  attr.to_s == attribute.to_s
end

Private Instance Methods

belongs_to_attribute?(relation) click to toggle source
# File lib/administrate/order.rb, line 76
def belongs_to_attribute?(relation)
  reflect_association(relation).macro == :belongs_to
end
foreign_key(relation) click to toggle source
# File lib/administrate/order.rb, line 84
def foreign_key(relation)
  reflect_association(relation).foreign_key
end
has_many_attribute?(relation) click to toggle source
# File lib/administrate/order.rb, line 72
def has_many_attribute?(relation)
  reflect_association(relation).macro == :has_many
end
opposite_direction() click to toggle source
# File lib/administrate/order.rb, line 49
def opposite_direction
  direction == :asc ? :desc : :asc
end
order_by_association(relation) click to toggle source
# File lib/administrate/order.rb, line 53
def order_by_association(relation)
  return order_by_count(relation) if has_many_attribute?(relation)

  return order_by_id(relation) if belongs_to_attribute?(relation)

  relation
end
order_by_count(relation) click to toggle source
# File lib/administrate/order.rb, line 61
def order_by_count(relation)
  relation.
    left_joins(attribute.to_sym).
    group(:id).
    reorder("COUNT(#{attribute}.id) #{direction}")
end
order_by_id(relation) click to toggle source
# File lib/administrate/order.rb, line 68
def order_by_id(relation)
  relation.reorder("#{foreign_key(relation)} #{direction}")
end
reflect_association(relation) click to toggle source
# File lib/administrate/order.rb, line 80
def reflect_association(relation)
  relation.klass.reflect_on_association(attribute.to_s)
end
reversed_direction_param_for(attr) click to toggle source
# File lib/administrate/order.rb, line 41
def reversed_direction_param_for(attr)
  if ordered_by?(attr)
    opposite_direction
  else
    :asc
  end
end
sanitize_direction(direction) click to toggle source
# File lib/administrate/order.rb, line 37
def sanitize_direction(direction)
  %w[asc desc].include?(direction.to_s) ? direction.to_sym : :asc
end