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