Я использую таблицы данных в своем приложении rails, и время загрузки начинает замедляться, когда в таблице около 16 000 записей. Я настроил таблицу для обработки данных на стороне сервера и использую гем will_paginate, но время загрузки по-прежнему часто составляет около 5 секунд. Что-нибудь особенно не так с моим кодом ниже, что может привести к такому большому времени загрузки?
Примечание. Я прокомментировал несколько строк в приведенных ниже фрагментах кода, чтобы увидеть, как они повлияли на время загрузки - нет.
Спасибо!
-Mike
class AccountsDatatable
delegate :params, :h, :link_to, :number_to_currency, to: :@view
attr_reader :user
include Rails.application.routes.url_helpers
include Pundit
def pundit_user
User.find(@current_user_id)
end
def initialize(view, account_status, current_user_id)
@view = view
@account_status = account_status
@current_user_id = current_user_id
@current_user = User.find(current_user_id)
end
def as_json(options = {})
{
sEcho: params[:sEcho].to_i,
iTotalRecords: Account.count,
iTotalDisplayRecords: accounts.total_entries,
aaData: data
}
end
private
def data
accounts.map do |account|
[
account.account_name,
account.account_status.to_s.humanize,
#account.get_departments_with_active_opportunities,
#account.get_departments_with_active_lobs,
link_to("Open", account_path(account), class: "btn btn-xs btn-success"),
((policy(account).update?) ? link_to("Edit", edit_modal_form_accounts_path(id: account.id), class: "btn btn-xs btn-default", remote: true) : " "),
((policy(account).destroy?) ? link_to("Delete", delete_modal_form_accounts_path(id: account.id), class: "btn btn-xs btn-danger", remote: true) : " ")
]
end
end
def accounts
@accounts ||= fetch_accounts
end
def fetch_accounts
if @account_status.nil? || @account_status == "all"
accounts = Account.order("#{sort_column} #{sort_direction}").all
else
accounts = Account.order("#{sort_column} #{sort_direction}").where(account_status: @account_status)
end
if params[:sSearch].present?
search = params[:sSearch]
begin
accounts = accounts.or( { account_name: (/.*#{search}.*/i) } )
rescue
accounts = accounts.or( { account_name: (/^#{::Regexp.escape(search)}$/i) } )
end
end
accounts = accounts.paginate(:page => page, :per_page => per_page)
accounts
end
def page
params[:iDisplayStart].to_i/per_page + 1
end
def per_page
params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
end
def sort_column
columns = %w[account_name account_status]
columns[params[:iSortCol_0].to_i]
end
def sort_direction
params[:sSortDir_0] == "desc" ? "desc" : "asc"
end
end
Сценарий страницы:
$(document).ready(function () {
const datatable_options = {
sPaginationType: 'full_numbers',
bProcessing: true,
bServerSide: true,
sAjaxSource: $('#accounts_table').data('source'),
columns: [
null,
null,
// { orderable: false },
// { orderable: false },
{ orderable: false },
{ orderable: false },
{ orderable: false }
]
};
initialize_datatable('#accounts_table', datatable_options);
});
View
<table id = "accounts_table" class="table table-striped accounts_table" data-source="<%= accounts_path(format: "json", account_status: @account_status ) %>" >
<thead>
<tr>
<th>Account Name</th>
<th>Classification</th>
<!--<th>Active prospecting departments</th>-->
<!--<th>Active departments</th>-->
<th> </th>
<th> </th>
<th> </th>
</tr>
</thead>
<tbody>
</tbody>
</table>