Module: AscDesc::ModelAdditions
- Defined in:
- lib/asc_desc/model_additions.rb
Instance Method Summary collapse
-
#asc(*args) ⇒ Object
(also: #ascending, #ascending_order)
Call asc on an ActiveRecord object or on an ActiveRecord::Relation object to sort the column(s) in an ascending way.
-
#desc(*args) ⇒ Object
(also: #descending, #descending_order)
Call desc on an ActiveRecord object or on an ActiveRecord::Relation object to sort the column(s) in a descending way.
-
#order_by(*args) ⇒ Object
a call to order_by just acts like the standard built-in "order" method (alias) Candy.where(:sugar => true).order_by('classification ASC, name ASC').
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_sym, *arguments, &block) ⇒ Object (private)
The dynamic order_by mechanism is built the same way as the dynamic finders present from the beginning of Ruby On Rails and allows to easely write the order clause for ActiveRecord queries.
using a column as part of the method name Candy.where(:sugar => true).order_by_name
using a column and a sort direction (asc|desc) as part of the method name Candy.where(:sugar => true).order_by_name_asc Candy.where(:sugar => true).order_by_name_desc
using multiple columns as part of the method name Candy.where(:sugar => true).order_by_classification_and_name Candy.where(:sugar => true).order_by_classification_and_name_and_sugar
using multiple columns and sort directions (asc|desc) as part of the method name Candy.where(:sugar => true).order_by_classification_asc_and_name_desc Candy.where(:sugar => true).order_by_classification_desc_and_name_asc Candy.where(:sugar => true).order_by_classification_asc_and_name_desc_and_sugar_asc
using multiple columns with or without sort direction (asc|desc) as part of the method name Candy.where(:sugar => true).order_by_classification_and_name_desc Candy.where(:sugar => true).order_by_classification_desc_and_name
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/asc_desc/model_additions.rb', line 101 def method_missing(method_sym, *arguments, &block) # the first argument is a Symbol, so we need to_s it if you want to match the pattern if method_sym.to_s =~ /^order_by_([_a-zA-Z]\w*)$/ columns = $1.split('_and_').map do |column| if column.ends_with?('_asc') "#{column[0..-5]} ASC" elsif column.ends_with?('_desc') "#{column[0..-6]} DESC" else "#{column} ASC" # always use explicit sort direction end end self.order(columns) else super end end |
Instance Method Details
#asc(*args) ⇒ Object Also known as: ascending, ascending_order
Call asc on an ActiveRecord object or on an ActiveRecord::Relation object to sort the column(s) in an ascending way.
using a symbol for the name of the column Candy.where(:sugar => true).asc(:name)
using a string for the name of the column Candy.where(:sugar => true).asc('name')
using multiple parameters to specify more than one column for the sort clause Candy.where(:sugar => true).asc(:classification, :name)
using an array to pass mutliple argument Candy.where(:sugar => true).asc([:classification, :name])
using a string to specify more than one column for the sort clause Candy.where(:sugar => true).asc('classification, name')
without argument, the method generates a sort by id (custom primary key supported) SELECT "candies".* FROM "candies" ORDER BY id ASC Candy.where(:sugar => true).asc
the method is chainable Candy.where(:sugar => true).asc(:classification).asc(:name)
29 30 31 |
# File 'lib/asc_desc/model_additions.rb', line 29 def asc(*args) self.order AscDesc.format_order_clause(*(args.presence || [self.primary_key]) << AscDesc::ASC) end |
#desc(*args) ⇒ Object Also known as: descending, descending_order
Call desc on an ActiveRecord object or on an ActiveRecord::Relation object to sort the column(s) in a descending way.
using a symbol for the name of the column Candy.where(:sugar => true).desc(:name)
using a string for the name of the column Candy.where(:sugar => true).desc('name')
using multiple parameters to specify more than one column for the sort clause Candy.where(:sugar => true).desc(:classification, :name)
using an array to pass mutliple argument Candy.where(:sugar => true).desc([:classification, :name])
using a string to specify more than one column for the sort clause Candy.where(:sugar => true).desc('classification, name')
without argument, the method generates a sort by id (custom primary key supported) SELECT "candies".* FROM "candies" ORDER BY id DESC Candy.where(:sugar => true).desc
the method is chainable Candy.where(:sugar => true).desc(:classification).desc(:name)
61 62 63 |
# File 'lib/asc_desc/model_additions.rb', line 61 def desc(*args) self.order AscDesc.format_order_clause(*(args.presence || [self.primary_key]) << AscDesc::DESC) end |
#order_by(*args) ⇒ Object
a call to order_by just acts like the standard built-in "order" method (alias) Candy.where(:sugar => true).order_by('classification ASC, name ASC')
71 72 73 |
# File 'lib/asc_desc/model_additions.rb', line 71 def order_by(*args) self.order(*args) end |