Class: Effective::ActiveRecordDatatableTool
- Inherits:
-
Object
- Object
- Effective::ActiveRecordDatatableTool
- Defined in:
- app/models/effective/active_record_datatable_tool.rb
Instance Attribute Summary collapse
-
#table_columns ⇒ Object
Returns the value of attribute table_columns.
Instance Method Summary collapse
-
#initialize(datatable, table_columns) ⇒ ActiveRecordDatatableTool
constructor
A new instance of ActiveRecordDatatableTool.
- #order(collection) ⇒ Object
- #order_column ⇒ Object
- #paginate(collection) ⇒ Object
- #search(collection) ⇒ Object
- #search_column_with_defaults(collection, table_column, term) ⇒ Object
- #search_terms ⇒ Object
Constructor Details
#initialize(datatable, table_columns) ⇒ ActiveRecordDatatableTool
Returns a new instance of ActiveRecordDatatableTool.
7 8 9 10 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 7 def initialize(datatable, table_columns) @datatable = datatable @table_columns = table_columns end |
Instance Attribute Details
#table_columns ⇒ Object
Returns the value of attribute table_columns.
3 4 5 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 3 def table_columns @table_columns end |
Instance Method Details
#order(collection) ⇒ Object
20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 20 def order(collection) return collection if order_column.blank? column = order_column[:column] if [:string, :text].include?(order_column[:type]) && order_column[:sql_as_column] != true collection.order("COALESCE(#{column}, '') #{order_direction}") elsif order_column[:type] == :belongs_to_polymorphic collection.order("(#{column.sub('_id"', '_type"')}, #{column}) #{order_direction} NULLS LAST") else collection.order("#{column} #{order_direction} NULLS LAST") end end |
#order_column ⇒ Object
16 17 18 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 16 def order_column @order_column ||= table_columns[order_name] end |
#paginate(collection) ⇒ Object
127 128 129 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 127 def paginate(collection) collection.page(page).per(per_page) end |
#search(collection) ⇒ Object
34 35 36 37 38 39 40 41 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 34 def search(collection) search_terms.each do |name, search_term| column_search = search_column(collection, table_columns[name], search_term) raise 'search_column must return an ActiveRecord::Relation object' unless column_search.kind_of?(ActiveRecord::Relation) collection = column_search end collection end |
#search_column_with_defaults(collection, table_column, term) ⇒ Object
43 44 45 46 47 48 49 50 51 52 53 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 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 114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 43 def search_column_with_defaults(collection, table_column, term) column = table_column[:column] sql_op = table_column[:filter][:sql_operation] || :where # only other option is :having case table_column[:type] when :string, :text if (table_column[:filter][:type] == :select && table_column[:filter][:fuzzy] != true) || sql_op != :where collection.public_send(sql_op, "#{column} = :term", term: term) else collection.public_send(sql_op, "#{column} ILIKE :term", term: "%#{term}%") end when :belongs_to_polymorphic # our key will be something like Post_15, or Event_1 (type, id) = term.split('_') if type.present? && id.present? collection.public_send(sql_op, "#{column} = :id AND #{column.sub('_id"', '_type"')} = :type", id: id, type: type) else collection end when :has_many inverse_ids = term.split(',').map { |term| (term = term.to_i) == 0 ? nil : term }.compact return collection unless inverse_ids.present? reflection = collection.klass.reflect_on_association(table_column[:name].to_sym) raise "unable to find #{collection.klass.name} :has_many :#{table_column[:name]} association" unless reflection obj = reflection.build_association({}) # Clinic klass = obj.class inverse = klass.reflect_on_association(collection.table_name) || obj.class.reflect_on_association(collection.table_name.singularize) raise "unable to find #{klass.name} has_many :#{collection.table_name} or belongs_to :#{collection.table_name.singularize} associations" unless inverse ids = klass.where(id: inverse_ids).joins(inverse.name).pluck(inverse.foreign_key) collection.public_send(sql_op, id: ids) when :obfuscated_id if ( = collection.deobfuscate(term)) == term # We weren't able to deobfuscate it, so this is an Invalid ID collection.public_send(sql_op, "#{column} = :term", term: 0) else collection.public_send(sql_op, "#{column} = :term", term: ) end when :effective_roles collection.with_role(term) when :datetime, :date begin digits = term.scan(/(\d+)/).flatten.map(&:to_i) start_at = Time.zone.local(*digits) case digits.length when 1 # Year end_at = start_at.end_of_year when 2 # Year-Month end_at = start_at.end_of_month when 3 # Year-Month-Day end_at = start_at.end_of_day when 4 # Year-Month-Day Hour end_at = start_at.end_of_hour when 5 # Year-Month-Day Hour-Minute end_at = start_at.end_of_minute when 6 end_at = start_at + 1.second else end_at = start_at end collection.public_send(sql_op, "#{column} >= :start_at AND #{column} <= :end_at", start_at: start_at, end_at: end_at) rescue => e collection end when :integer collection.public_send(sql_op, "#{column} = :term", term: term.gsub(/\D/, '').to_i) when :year collection.public_send(sql_op, "EXTRACT(YEAR FROM #{column}) = :term", term: term.to_i) when :price price_in_cents = (term.gsub(/[^0-9|\.]/, '').to_f * 100.0).to_i collection.public_send(sql_op, "#{column} = :term", term: price_in_cents) when :currency, :decimal collection.public_send(sql_op, "#{column} = :term", term: term.gsub(/[^0-9|\.]/, '').to_f) else collection.public_send(sql_op, "#{column} = :term", term: term) end end |
#search_terms ⇒ Object
12 13 14 |
# File 'app/models/effective/active_record_datatable_tool.rb', line 12 def search_terms @search_terms ||= @datatable.search_terms.select { |name, search_term| table_columns.key?(name) } end |