Refactor datatable class to a controller concern

This commit is contained in:
Nishanth Vijayan 2016-08-09 23:00:11 +05:30
parent 6cb6ddf78d
commit 7d3a6ab05c
2 changed files with 16 additions and 17 deletions

View file

@ -1,16 +1,19 @@
module Admin module Admin
class UsersController < Admin::BaseController class UsersController < Admin::BaseController
load_and_authorize_resource load_and_authorize_resource
include DatatableServersideProcessing
def new def new
@user = User.new @user = User.new
end end
def index def index
users_datatable = Datatable.new(view_context, User.where(nil), %w(name email), %w(id state email name)) @users = filtered_records(User.where(nil), %w(name email), %w(id state email name))
respond_to do |format| respond_to do |format|
format.html format.html
format.json { render json: users_datatable.to_json(data: users_datatable.paginated_records.map {|user| users_datatable_data(user)}) } format.json do
render json: datatable_response(@users.map {|user| users_datatable_data(user)})
end
end end
end end

View file

@ -1,23 +1,19 @@
class Datatable module DatatableServersideProcessing
delegate :params, to: :@view extend ActiveSupport::Concern
def initialize(view, collection, search_columns, sort_columns) def datatable_response(data)
@view = view
@collection = collection
@search_columns = search_columns
@sort_columns = sort_columns
end
def as_json(options={})
{ {
sEcho: params[:sEcho].to_i, sEcho: params[:sEcho].to_i,
iTotalRecords: @collection.count, iTotalRecords: @collection.count,
iTotalDisplayRecords: records.count, iTotalDisplayRecords: records.count,
aaData: options[:data] aaData: data
} }
end end
def paginated_records def filtered_records(collection, search_columns, sort_columns)
@collection = collection
@search_columns = search_columns
@sort_columns = sort_columns
paginate(records) paginate(records)
end end
@ -31,12 +27,12 @@ class Datatable
sort_direction = params[:sSortDir_0] == 'desc' ? 'desc' : 'asc' sort_direction = params[:sSortDir_0] == 'desc' ? 'desc' : 'asc'
sort_column = @sort_columns[params[:iSortCol_0].to_i] sort_column = @sort_columns[params[:iSortCol_0].to_i]
records = @collection.order("#{sort_column} #{sort_direction}") records = @collection.order("#{sort_column} #{sort_direction}")
if params[:sSearch].present? && @search_columns.present? if params[:sSearch].present? && @search_columns.present?
search_query = '' search_query = @search_columns.map{ |column| "#{column} like :search" }.join(' or ')
@search_columns.each { |column| search_query += "#{column} like :search or " }
search_query = search_query.chomp(' or ')
records = records.where(search_query, search: "%#{params[:sSearch]}%") records = records.where(search_query, search: "%#{params[:sSearch]}%")
end end
records records
end end