class Administrate::Order

Attributes

association_attribute[R]
attribute[R]
direction[R]

Public Class Methods

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

Public Instance Methods

apply(relation) click to toggle source
# File lib/administrate/order.rb, line 9
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
    column_exist?(relation, attribute)

  relation
end
order_params_for(attr) click to toggle source
# File lib/administrate/order.rb, line 25
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 21
def ordered_by?(attr)
  attr.to_s == attribute.to_s
end

Private Instance Methods

association_table_name() click to toggle source
# File lib/administrate/order.rb, line 141
def association_table_name
  attribute.tableize
end
column_exist?(table, column_name) click to toggle source
# File lib/administrate/order.rb, line 113
def column_exist?(table, column_name)
  table.columns_hash.key?(column_name.to_s)
end
foreign_key(relation) click to toggle source
# File lib/administrate/order.rb, line 137
def foreign_key(relation)
  reflect_association(relation).foreign_key
end
opposite_direction() click to toggle source
# File lib/administrate/order.rb, line 50
def opposite_direction
  direction == :asc ? :desc : :asc
end
order_by_association(relation) click to toggle source
# File lib/administrate/order.rb, line 54
def order_by_association(relation)
  case relation_type(relation)
  when :has_many
    order_by_count(relation)
  when :belongs_to
    order_by_belongs_to(relation)
  when :has_one
    order_by_has_one(relation)
  else
    relation
  end
end
order_by_association_id(relation) click to toggle source
# File lib/administrate/order.rb, line 102
def order_by_association_id(relation)
  relation.reorder(Arel.sql(order_by_association_id_query))
end
order_by_association_id_query() click to toggle source
# File lib/administrate/order.rb, line 121
def order_by_association_id_query
  "#{association_table_name}.id #{direction}"
end
order_by_attribute(relation) click to toggle source
# File lib/administrate/order.rb, line 92
def order_by_attribute(relation)
  relation.joins(
    attribute.to_sym,
  ).reorder(Arel.sql(order_by_attribute_query))
end
order_by_attribute_query() click to toggle source
# File lib/administrate/order.rb, line 125
def order_by_attribute_query
  "#{association_table_name}.#{association_attribute} #{direction}"
end
order_by_belongs_to(relation) click to toggle source
# File lib/administrate/order.rb, line 76
def order_by_belongs_to(relation)
  if ordering_by_association_column?(relation)
    order_by_attribute(relation)
  else
    order_by_id(relation)
  end
end
order_by_count(relation) click to toggle source
# File lib/administrate/order.rb, line 67
def order_by_count(relation)
  klass = reflect_association(relation).klass
  query = "COUNT(#{klass.table_name}.#{klass.primary_key}) #{direction}"
  relation.
    left_joins(attribute.to_sym).
    group(:id).
    reorder(Arel.sql(query))
end
order_by_has_one(relation) click to toggle source
# File lib/administrate/order.rb, line 84
def order_by_has_one(relation)
  if ordering_by_association_column?(relation)
    order_by_attribute(relation)
  else
    order_by_association_id(relation)
  end
end
order_by_id(relation) click to toggle source
# File lib/administrate/order.rb, line 98
def order_by_id(relation)
  relation.reorder(Arel.sql(order_by_id_query(relation)))
end
order_by_id_query(relation) click to toggle source
# File lib/administrate/order.rb, line 117
def order_by_id_query(relation)
  "#{relation.table_name}.#{foreign_key(relation)} #{direction}"
end
ordering_by_association_column?(relation) click to toggle source
# File lib/administrate/order.rb, line 106
def ordering_by_association_column?(relation)
  association_attribute &&
    column_exist?(
      reflect_association(relation).klass, association_attribute.to_sym
    )
end
reflect_association(relation) click to toggle source
# File lib/administrate/order.rb, line 133
def reflect_association(relation)
  relation.klass.reflect_on_association(attribute.to_s)
end
relation_type(relation) click to toggle source
# File lib/administrate/order.rb, line 129
def relation_type(relation)
  reflect_association(relation).macro
end
reversed_direction_param_for(attr) click to toggle source
# File lib/administrate/order.rb, line 42
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 38
def sanitize_direction(direction)
  %w[asc desc].include?(direction.to_s) ? direction.to_sym : :asc
end