2016-08-09 23:00:11 +05:30
|
|
|
module DatatableServersideProcessing
|
|
|
|
|
extend ActiveSupport::Concern
|
2016-08-09 21:01:14 +05:30
|
|
|
|
2016-08-09 23:00:11 +05:30
|
|
|
def datatable_response(data)
|
2016-08-09 21:01:14 +05:30
|
|
|
{
|
|
|
|
|
sEcho: params[:sEcho].to_i,
|
|
|
|
|
iTotalRecords: @collection.count,
|
|
|
|
|
iTotalDisplayRecords: records.count,
|
2016-08-09 23:00:11 +05:30
|
|
|
aaData: data
|
2016-08-09 21:01:14 +05:30
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
2016-08-09 23:00:11 +05:30
|
|
|
def filtered_records(collection, search_columns, sort_columns)
|
|
|
|
|
@collection = collection
|
|
|
|
|
@search_columns = search_columns
|
|
|
|
|
@sort_columns = sort_columns
|
2016-08-09 21:01:14 +05:30
|
|
|
paginate(records)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
|
|
def records
|
|
|
|
|
@records ||= fetch_records
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def fetch_records
|
|
|
|
|
sort_direction = params[:sSortDir_0] == 'desc' ? 'desc' : 'asc'
|
|
|
|
|
sort_column = @sort_columns[params[:iSortCol_0].to_i]
|
|
|
|
|
records = @collection.order("#{sort_column} #{sort_direction}")
|
2016-08-09 23:00:11 +05:30
|
|
|
|
2016-08-09 21:01:14 +05:30
|
|
|
if params[:sSearch].present? && @search_columns.present?
|
2016-08-09 23:00:11 +05:30
|
|
|
search_query = @search_columns.map{ |column| "#{column} like :search" }.join(' or ')
|
2016-08-09 21:01:14 +05:30
|
|
|
records = records.where(search_query, search: "%#{params[:sSearch]}%")
|
|
|
|
|
end
|
2016-08-09 23:00:11 +05:30
|
|
|
|
2016-08-09 21:01:14 +05:30
|
|
|
records
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def paginate(records)
|
|
|
|
|
per_page = params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
|
|
|
|
|
page = params[:iDisplayStart].to_i / per_page + 1
|
|
|
|
|
records.offset((page - 1) * per_page).limit(per_page)
|
|
|
|
|
end
|
|
|
|
|
end
|