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