| 
1 |  | -require "ajax-datatables-rails/version"  | 
 | 1 | +require 'rails'  | 
2 | 2 | 
 
  | 
3 |  | -module Ajax  | 
4 |  | -  module Datatables  | 
5 |  | -    module Rails  | 
6 |  | -      # Your code goes here...  | 
 | 3 | +class AjaxDatatablesRails  | 
 | 4 | + | 
 | 5 | +  VERSION = '0.0.1'  | 
 | 6 | + | 
 | 7 | +  class << self  | 
 | 8 | + | 
 | 9 | +    def columns(column_array)  | 
 | 10 | +      @@columns ||= column_array  | 
 | 11 | +    end  | 
 | 12 | + | 
 | 13 | +    def model_name(model_name)  | 
 | 14 | +      @@model_name ||= model_name  | 
 | 15 | +    end  | 
 | 16 | + | 
 | 17 | +    def searchable_columns(columns_array)  | 
 | 18 | +      @@searchable_columns ||= columns_array  | 
 | 19 | +    end  | 
 | 20 | + | 
 | 21 | +  end  | 
 | 22 | + | 
 | 23 | +  def initialize(view)  | 
 | 24 | +    @view = view  | 
 | 25 | +  end  | 
 | 26 | + | 
 | 27 | +  def method_missing(meth, *args, &block)  | 
 | 28 | +    @view.send(meth, *args, &block)  | 
 | 29 | +  end  | 
 | 30 | + | 
 | 31 | +  def as_json(options = {})  | 
 | 32 | +    {  | 
 | 33 | +      sEcho: params[:sEcho].to_i,  | 
 | 34 | +      iTotalRecords: @@model_name.count,  | 
 | 35 | +      iTotalDisplayRecords: get_raw_records.count,  | 
 | 36 | +      aaData: data  | 
 | 37 | +    }  | 
 | 38 | +  end  | 
 | 39 | + | 
 | 40 | +private  | 
 | 41 | + | 
 | 42 | +  def get_raw_records  | 
 | 43 | +    raise  | 
 | 44 | +  end  | 
 | 45 | + | 
 | 46 | +  def fetch_records  | 
 | 47 | +    search_records(sort_records(paginate_records(get_raw_records)))  | 
 | 48 | +  end  | 
 | 49 | + | 
 | 50 | +  def paginate_records(records)  | 
 | 51 | +    records.page(page).per(per_page)  | 
 | 52 | +  end  | 
 | 53 | + | 
 | 54 | +  def sort_records(records)  | 
 | 55 | +    records.order("#{sort_column} #{sort_direction}")  | 
 | 56 | +  end  | 
 | 57 | + | 
 | 58 | +  def search_records(records)  | 
 | 59 | +    if params[:sSearch].present?  | 
 | 60 | +      query = @@searchable_columns.map do |column|  | 
 | 61 | +        "#{column} LIKE :search"  | 
 | 62 | +      end.join(" OR ")  | 
 | 63 | +      records = records.where(query, search: "%#{params[:sSearch]}%")  | 
7 | 64 |     end  | 
 | 65 | +    return records  | 
 | 66 | +  end  | 
 | 67 | + | 
 | 68 | +  def page  | 
 | 69 | +    params[:iDisplayStart].to_i/per_page + 1  | 
 | 70 | +  end  | 
 | 71 | + | 
 | 72 | +  def per_page  | 
 | 73 | +    params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10  | 
 | 74 | +  end  | 
 | 75 | + | 
 | 76 | +  def sort_column  | 
 | 77 | +    @@columns[params[:iSortCol_0].to_i]  | 
 | 78 | +  end  | 
 | 79 | + | 
 | 80 | +  def sort_direction  | 
 | 81 | +    params[:sSortDir_0] == "desc" ? "DESC" : "ASC"  | 
8 | 82 |   end  | 
9 | 83 | end  | 
0 commit comments