如何显示数千条记录

时间:2016-12-31 16:23:55

标签: sql ruby-on-rails ruby datatable

我有一个名为clientes的表,这个表有大约15536​​条记录,这使得数据加载速度极慢。如何优化日志负载以改进过程?

这是我的索引视图

<h1>Clientes</h1>
<style>
.container {
}

</style>




  <table id="clientes" class="display"><!--el id clientes es de datatables referenciado en clientes.coffe y display class es una clase de datatables-->
  <thead>

    <tr><!--active es para sombrear la fila-->
      <th>Clave</th>
      <th>Nombre</th>
      <th>Nombre Corto</th>
      <th>Dirección</th>
      <th>Colonia</th>
      <th>Credito</th>
      <th>DiasCredito</th>
      <th>LimiteCredito</th>
      <th>Saldo</th>
      <th>Ruta</th>
      <th>Promociones</th>
      <th>Acción</th>
      <th></th>

    </tr>
  </thead>
    <tbody id="container_clientes">
      <%= render @clientes %><!--carga todos los clientes-->
</tbody>

my partial cliente.html.erb

<tr id="cliente_<%= cliente.id %>">
  <td><%=cliente.IdCli%>

</td>
  <td><%=cliente.Nombre%></td>
  <td><%=cliente.NombreCorto%></td>
  <td><%=cliente.Direccion%></td>
  <td><%=cliente.Colonia%></td>
  <td>
    <% if cliente.Credito == true%>
      <input type="checkbox" disabled="true" checked="true">
    <%else%>
      <input type="checkbox" disabled="true" >
    <%end%>
  </td>
  <td><%=cliente.DiasCreedito%></td>
  <td><%=cliente.LimiteCredito%></td>
  <td>
    <% if cliente.detallecob.last != nil%>
        <%=cliente.detallecob.last.Saldo%>
      <%else%>
        <%=cliente.Saldo%>
    <%end%>
  </td>
  <td>
    <% if cliente.relclirutas != nil%>
      <% cliente.relclirutas.each do |varias| %>
        <%=varias.ruta.Ruta%>
      <%end%>
    <%end%>
  </td>
  <td>
    <% if cliente.relclili != nil%>
      <%=cliente.relclili.listapromomast.ListaMaster%>
    <%end%>
  </td>


    <td>
        <%= link_to '<i class="fa fa-gift" aria-hidden="true"></i> Activos'.html_safe, activos_cliente_path(cliente), class:"btn btn-primary btn-xs boton" %>

        <button type="button" class="btn btn-warning btn-xs" data-toggle="modal" data-target="#myupdatecliente_<%= cliente.id %>">
          Editar
        </button>
        <!--Destroy-->
        <% if cliente.Status == true%>
          <%= link_to 'Eliminar', cliente, method: :delete, class: "btn btn-danger btn-xs", remote:true %>
        <%else%>
          <%= link_to 'Habilitar', cliente, method: :delete, class: "btn btn-success btn-xs", remote:true %>
        <%end%>
      </td>


<td class="no" >
    </td>
</tr>

3 个答案:

答案 0 :(得分:1)

您可以使用kaminari gem进行数据分页,只需访问下一页就可以获取更多数据。

Cliente.page(1).per(50)

kaminari也会为你做分页链接,只需使用帮助

<%= paginate @cliente %>

您可以在README中找到该用法。

为了更好的用户体验,您应该通过API(AJAX)进行通信,并使用无限滚动等技术。

答案 1 :(得分:1)

你可以卸载你的提取。这意味着,使用javascript和ajax稍微复杂一些的方法。在这个例子中我不会使用分页宝石。

修改您的控制器:

def index
    if !params[:page].blank?
        respond_to do |f|
            f.html {}
            f.json { # only for pagination, work around this to make it more complex
                offset = 50*params[:page].to_i
                @clients = Client.offset(offset).limit(50).select("field1, field2") # appended to any other condition you may have
                render :json => @clients.as_json
            }
        end
    else
        @clients = Client.limit(50)
    end
end

我不会发布更多内容,你可以搞清楚。在文档加载时,添加一个ajax fetch事件:

  • Call / clientes?page = 2 etc(添加增量计数器)
  • 直到你得到以下的空响应:
    • 对于获得json响应的每一行,按照部分代码在表中追加一行

您可以使用计时器或循环执行此操作。但这是一种在加载第一组行(在此示例中为50)后页面将变为响应的方式,然后,当您工作时,将获取更多行。

答案 2 :(得分:0)

这是一个猜测,因为我不是一个红宝石程序员,但是,让我们看看这个:

<td>
    <% if cliente.relclirutas != nil%>
      <% cliente.relclirutas.each do |varias| %>
        <%=varias.ruta.Ruta%>
      <%end%>
    <%end%>
  </td>

如果这意味着,

if cliente.relclirutas is not null or an empty string
loop through it and display each value of varias.ruta.Ruta

然后你不需要if语句。只需遍历空值或空字符串。这可能会在每条记录上节省几纳秒,其中你有15,000多个。