Module: SortThis::ActiveRecord::ClassMethods
- Defined in:
- lib/sort_this/active_record.rb
Instance Method Summary collapse
- #default_sort ⇒ Object
- #sort(sort_column = nil, sort_direction = DEFAULT_SORT_DIRECTION) ⇒ Object
-
#sort_this(sorts = {}) ⇒ Object
Input is a hash of sort_name => sort_options pairs.
Instance Method Details
#default_sort ⇒ Object
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 = {} = { :column_name => nil, :default => nil, :table_name => nil, :joins => nil, :clause => nil } sorts.each do |sort_name, | = .merge() self.sort_columns[sort_name] = column = ([:column_name].blank?) ? sort_name : [:column_name] table = ([:table_name].blank?) ? table_name : [:table_name].to_s.pluralize clause = ([:clause].blank?) ? "#{table}.#{column}" : [: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 [:default].blank? default_sort_direction = [: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 |