2016-12-31 2 views
2

Ich habe eine Tabelle namens clientes, diese Tabelle hat rund 15536 ​​Datensätze, wodurch Daten extrem langsam geladen werden. Wie kann ich die Protokolllast optimieren, um den Prozess zu verbessern?Wie Tausende von Datensätzen angezeigt werden

dies ist meine Indexansicht

<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> 

mein Teil 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> 
+0

Haben Sie Paging für die Daten durchgeführt oder laden Sie sie einfach? – gaga5lala

+0

Es ist eine einfache Entscheidung. Auf der einen Seite können Sie alle Ihre Datensätze gleichzeitig in den Browser laden. Wie lange das Laden dauert, hängt von vielen Dingen ab, die außerhalb Ihrer Kontrolle liegen, z. B. dem Computer des Benutzers. Es könnte das Warten wert sein. Auf der anderen Seite können Sie schnell einige Datensätze gleichzeitig laden und den Benutzer auswählen, um mehr zu sehen.Wie jede Entscheidung hat jede Option zumindest einen Vorteil gegenüber dem anderen. –

+0

@ gaga5lala nur einmal laden, in der Datentabelle – LuisC

Antwort

0

Dies ein bisschen einer Vermutung ist, weil ich keinen Programmierer Rubin bin, aber schauen sie sich an dies:

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

Wenn das bedeutet,

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

Dann brauchen Sie die if-Anweisung nicht. Durchlaufen Sie einfach den Nullwert oder die leere Zeichenfolge. Dadurch können Sie bei jedem Datensatz, von dem Sie 15.000 plus haben, einige Nanosekunden sparen.

1

Sie können kaminari Gem für Datenpaging verwenden, nehmen Sie einfach einen Teil der Daten und erfordern mehr durch Zugriff auf die nächste Seite.

Cliente.page(1).per(50) 

kaminari tun auch die Paginierung Links für Sie, verwenden Sie einfach den Helfer

<%= paginate @cliente %> 

Sie die Verwendung in README finden.

Für bessere UX, sollten Sie die Anfrage über API kommunizieren (AJAX), und einige Tech wie unendliches Scrollen verwenden.

1

Sie könnten Ihren Abruf abladen. Dies bedeutet, verwenden Sie einen etwas komplexeren Ansatz mit Javascript und Ajax. Ich werde in diesem Beispiel keinen Seitenumbruch-Edelstein verwenden.

Ändern Sie bitte Ihre Controller:

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 

Ich werde nicht mehr schreiben, können Sie es herausfinden. Auf Dokument laden, fügt ein Ajax-Ereignis holen, das wird:

  • Call/clientes page = 2 usw. (ein Inkrement Zähler hinzufügen)
  • Sie, bis Sie eine leere Antwort folgende erhalten:
    • für jede Zeile, die Sie der json Antwort erhalten, fügen Sie eine Zeile in der Tabelle, nach dem Teilcode

Sie es mit einem Timer oder einer Schleife tun kann. Auf diese Weise wird Ihre Seite nach dem Laden einer ersten Reihe von Zeilen (in diesem Beispiel 50) reaktionsschnell, und während Sie arbeiten, werden mehr Zeilen abgerufen.

+0

danke für die antwort. Diese Methode funktioniert mit Datentabelle? – LuisC

+0

Was ist "datatable"? Alles, was ich in Ihrer Frage sehe, ist eine Tabelle und ein Render für jede Zeile. Das sollte funktionieren, wie es deiner Frage entspricht ... –

Verwandte Themen