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