class ActiveDataTables
Public Class Methods
find(query, params)
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 23 def self.find(query, params) new(query, params).execute end
new(query, params)
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 5 def initialize(query, params) @query = query @params = params end
Public Instance Methods
execute()
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 10 def execute total = @query.count apply_filtering filtered = @query.count apply_ordering apply_paging DataTablesResult.new(@params[:draw].to_i, @query, total, filtered) end
Private Instance Methods
apply_filtering()
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 54 def apply_filtering columns = searchable_columns if @params[:search] && !@params[:search][:value].blank? search_value = @params[:search][:value].downcase if @query.is_a?(Array) @query = @query.select do |item| columns.select do |k, v| column_data = v[:data].to_sym item[column_data].to_s.downcase.include?(search_value) end.length > 0 end else clauses = nil columns.each do |k, v| column_data = v[:data].to_sym clause = @query.arel_table[column_data].matches("%#{search_value}%") if clauses.nil? clauses = clause else clauses = clauses.or(clause) end end @query = @query.where(clauses) end end end
apply_ordering()
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 102 def apply_ordering order_instructions = @params[:order] || {} columns = load_columns order = {} order_instructions.each_pair do |k, v| column_index = v[:column] column_name = columns[column_index.to_sym][:data] order[column_name.to_sym] = v[:dir].to_sym end if @query.respond_to?(:reorder) @query = @query.reorder(order) else @query = @query.sort do |row1, row2| keys = order.map{ |key, direction| val = direction == :desc ? -1 : 1 if row1[key].nil? && !row2[key].nil? val * -1 elsif row2[key].nil? && !row1[key].nil? val * 1 elsif row1[key] == true val * 1 elsif row1[key] == false val * -1 elsif row1[key] == row2[key] 0 else val * (row1[key] <=> row2[key]) end } keys.find { |x| x != 0 } || 0 end end end
apply_paging()
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 84 def apply_paging if @params[:start] if @query.respond_to?(:offset) @query = @query.offset(@params[:start]) else @query = @query.drop(@params[:start].to_i) end end if @params[:length] if @query.respond_to?(:limit) @query = @query.limit(@params[:length]) else @query = @query.first(@params[:length].to_i) end end end
load_columns()
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 138 def load_columns @params[:columns] || {} end
searchable_columns()
click to toggle source
# File lib/active_data_tables/active_data_tables.rb, line 142 def searchable_columns columns = load_columns searchable = {} searchable = columns.select do |column_index| columns[column_index][:searchable] == "true" end searchable end