Module: SimpleSearch::ActiveRecord::ClassMethods
- Defined in:
- lib/simple_search/active_record.rb
Instance Method Summary collapse
- #filtered_params(params) ⇒ Object
- #simplesearch(params = {}) ⇒ Object (also: #ss)
- #with_ss_group(arel, group_by) ⇒ Object
- #with_ss_limit_offset(arel, params) ⇒ Object
- #with_ss_order(arel, order_by) ⇒ Object
- #with_ss_where(arel, params = {}) ⇒ Object
Instance Method Details
#filtered_params(params) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/simple_search/active_record.rb', line 34 def filtered_params(params) where_params = {} other_params = {} params.each do |key,value| if ["group_by","page_by","page", "order_by"].include?(key) other_params[key]=value elsif value != '' matches = /(.*)_([a-z]+)$/.match(key) if matches!=nil && matches.length==3 all, col, op = matches.to_a operands = SimpleSearch::OP_MAP.keys if operands.include?(op.to_sym) where_params[key]=value end end end end [other_params, where_params] end |
#simplesearch(params = {}) ⇒ Object Also known as: ss
21 22 23 24 25 26 27 28 29 30 |
# File 'lib/simple_search/active_record.rb', line 21 def simplesearch(params={}) arel = self.scoped unless self.is_a?(::ActiveRecord::Relation) other_params, where_params=filtered_params(params) # validate params arel = with_ss_where(arel,where_params) arel = with_ss_group(arel,other_params['group_by']) arel = with_ss_order(arel,other_params['order_by']) arel = with_ss_limit_offset(arel,other_params) arel end |
#with_ss_group(arel, group_by) ⇒ Object
83 84 85 86 |
# File 'lib/simple_search/active_record.rb', line 83 def with_ss_group(arel,group_by) arel= arel.group(group_by) if group_by arel end |
#with_ss_limit_offset(arel, params) ⇒ Object
93 94 95 96 97 98 |
# File 'lib/simple_search/active_record.rb', line 93 def with_ss_limit_offset(arel,params) page_by = params['page_by'].to_i page_num = params['page'] ? params['page'].to_i : ( page_by>0 ? 1 : 0 ) arel = arel.limit(page_by).offset( (page_num-1)*page_by ) if page_by>0 && page_num>0 arel end |
#with_ss_order(arel, order_by) ⇒ Object
88 89 90 91 |
# File 'lib/simple_search/active_record.rb', line 88 def with_ss_order(arel,order_by) arel= arel.order(order_by) if order_by arel end |
#with_ss_where(arel, params = {}) ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/simple_search/active_record.rb', line 54 def with_ss_where(arel,params={}) params.each do |key,value| matches = /(.*)_([a-z]+)$/.match(key) all, col, op = matches.to_a where_col = col =~ /\./ ? col : "#{arel.table_name}.#{col}" #if no table name, the add it where_value = case op.to_sym when :gt,:ge,:lt,:le,:eq,:ne then value when :sw then "#{value}%" # LIKE when :ew then "%#{value}" # LIKE when :ct,:contains,:like then "%#{value}%" # LIKE when :nc,:notcontains,:notlike then "%#{value}%" # NOT LIKE when :is, :isnot, :it if ["NULL","null"].include?(value) then nil elsif ["TRUE","true"].include?(value) then true elsif ["FALSE","false"].include?(value) then false end end if op.to_sym==:in arel = arel.where("#{where_col}"=>value.split(',')) elsif [:bt, :between].include? op.to_sym first,second = value.split('..') arel = arel.where("#{where_col}"=>Range.new(first,second)) else arel = arel.where("#{where_col} #{SimpleSearch::OP_MAP[op.to_sym]} ?", where_value) end end arel end |