Module: SortThis::ActiveRecord::ClassMethods

Defined in:
lib/sort_this/active_record.rb

Instance Method Summary collapse

Instance Method Details

#default_sortObject



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/sort_this/active_record.rb', line 65

def default_sort
  table_joins   = []
  order_clauses = []
  
  self.default_sort_columns.each do |column_name, sort_clause|
    join = sort_columns[column_name][:joins]
    table_joins   << join unless join.nil?
    order_clauses << sort_clause
  end
  
  query = base_query
  query = joins(table_joins.uniq!) unless table_joins.empty?
  query = query.order(order_clauses.join(', '))
  query
end

#sort(sort_column = nil, sort_direction = DEFAULT_SORT_DIRECTION) ⇒ Object



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/sort_this/active_record.rb', line 81

def sort(sort_column = nil, sort_direction = DEFAULT_SORT_DIRECTION)
  query = base_query
    
  # sanitize the sort column and direction
  sort_column     = sort_column.to_s.downcase.to_sym
  sort_direction  = sort_direction.upcase
  sort_direction  = (VALID_SORT_DIRECTIONS.include?(sort_direction) ? sort_direction : DEFAULT_SORT_DIRECTION)
  
  table_joins   = []
  order_clauses = []
  
  if !sort_column.blank? && sort_columns.include?(sort_column)      
    join = sort_columns[sort_column][:joins]
    table_joins   << join unless join.nil?
    order_clauses << "#{sort_columns[sort_column][:clause]} #{sort_direction}"
  end
  
  default_sorts = default_sort_columns.clone
  default_sorts.delete(sort_column) unless sort_column.blank? # remove the sort column's default if it exists
  
  default_sorts.each do |column_name, sort_clause|
    join = sort_columns[column_name][:joins]
    table_joins   << join unless join.nil?
    order_clauses << sort_clause
  end
  
  table_joins.uniq!
  query = query.joins(table_joins) unless table_joins.empty?
  
  query = query.order(order_clauses.join(', '))
  
  query
end

#sort_this(sorts = {}) ⇒ Object

Input is a hash of sort_name => sort_options pairs

:column_name => (optional) Column name to sort on, if left blank it will use the sort_name :default => (optional) ‘ASC’|‘DESC’ :table_name => (optional) Override the table name, required if using joins :joins => (optional) Association to join on. Note: must be an association of the model being sorted. :clause => (optional) Override the clause of the sort

ex. products have many quotes vendors have many quotes

sorting on the quotes table

:sort_name1 => { :column_name => :quantity } :sort_name2 => { :column_name => :price, :default => ‘DESC’ } :sort_name3 => { :column_name => :name, :table_name => ‘products’, :joins => :product }



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/sort_this/active_record.rb', line 34

def sort_this(sorts = {})
  self.sort_columns = {}
  self.default_sort_columns = {}
  
  empty_sort_options = { :column_name => nil, :default => nil, :table_name => nil, :joins => nil, :clause => nil }
  
  sorts.each do |sort_name, sort_options|
    sort_options = empty_sort_options.merge(sort_options)
    
    self.sort_columns[sort_name] = sort_options
    
    column  = (sort_options[:column_name].blank?) ? sort_name             : sort_options[:column_name]
    table   = (sort_options[:table_name].blank?)  ? table_name            : sort_options[:table_name].to_s.pluralize
    clause  = (sort_options[:clause].blank?)      ? "#{table}.#{column}"  : sort_options[:clause]
    
    self.sort_columns[sort_name][:column_name]  = column
    self.sort_columns[sort_name][:table_name]   = table
    self.sort_columns[sort_name][:clause]       = clause
    
    unless sort_options[:default].blank?
      default_sort_direction = sort_options[:default].upcase
      
      unless VALID_SORT_DIRECTIONS.include?(default_sort_direction)
        raise SortThisError, "Invalid sort direction for: #{sort_name}. Must be 'ASC'/'asc' or 'DESC'/'desc'."
      end   
      
      self.default_sort_columns[sort_name] = "#{clause} #{default_sort_direction}"
    end
  end
end