From bf9a845780d864eb90de1c90e4d1a0dcab5793a0 Mon Sep 17 00:00:00 2001 From: Ilion Beyst Date: Fri, 11 Sep 2015 12:00:49 +0200 Subject: [PATCH] implement pagination --- app/controllers/concerns/data_table.rb | 52 ++++++++++--------- .../concerns/transactions_query.rb | 1 - 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/app/controllers/concerns/data_table.rb b/app/controllers/concerns/data_table.rb index 825f96d..6498fc1 100644 --- a/app/controllers/concerns/data_table.rb +++ b/app/controllers/concerns/data_table.rb @@ -8,22 +8,38 @@ class DataTable end def json - response_json(@params[:draw], data) + { + draw: @params[:draw], + recordsTotal: @user.transactions.count, + recordsFiltered: count, + data: data + } end + private + def data - ActiveRecord::Base.connection.execute(self.query.to_sql) + run_query(paginated_query.project(Arel.star)) + end + + def count + run_query(query.project(Arel.star.count)).first[0] + end + + def paginated_query + query.skip(@params[:start]).take(@params[:length]) end def query - pred = predicates - q = @transactions.query - q = q.where(pred) if pred - q + return @query if @query # Do not build query twice + @query = @transactions.query + @query.where(predicate) if predicate + @query end - def predicates - [ *range_predicates(:amount), + def predicate + @predicate ||= [ + *range_predicates(:amount), *range_predicates(:time), eq_predicate(:peer), eq_predicate(:issuer), @@ -49,7 +65,9 @@ class DataTable @table[name].matches("%#{value}%") if value end - private + def run_query query + ActiveRecord::Base.connection.execute(query.to_sql) + end def sanitize_params(params) # Parsing according to https://datatables.net/manual/server-side @@ -82,21 +100,5 @@ class DataTable end return clean end - - def response_json(draw, selection) - { - draw: draw, - recordsTotal: @user.transactions.count, - recordsFiltered: selection.count, - #data: selection.offset(params[:start]).take(params[:length]).map { |transaction| { - #time: transaction.created_at, - #amount: transaction.signed_amount_for(user), - #peer: transaction.peer_of(user).try(:name), - #issuer: transaction.issuer.name, - #message: transaction.message, - #}} - data: selection - } - end end diff --git a/app/controllers/concerns/transactions_query.rb b/app/controllers/concerns/transactions_query.rb index bfd62d4..3276d57 100644 --- a/app/controllers/concerns/transactions_query.rb +++ b/app/controllers/concerns/transactions_query.rb @@ -12,7 +12,6 @@ class TransactionsQuery def query Arel::SelectManager.new(ActiveRecord::Base) .from(arel) - .project(Arel.star) end def arel