2016-12-31 11 views
2

私はクライアントと呼ばれるテーブルを持っていますが、このテーブルには約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> 

私の部分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

データをページングするか、一度に読み込むだけでしたか? – gaga5lala

+0

これは簡単な決定です。一方で、すべてのレコードをブラウザに一度に読み込むことができます。ロードにかかる時間は、ユーザーのコンピュータなど、制御できない多くのものによって異なります。それは待つ価値があるかもしれません。一方、一度にいくつかのレコードをすばやく読み込んで、ユーザーが何かを選択してより多くのレコードを表示できるようにします。すべての決定と同様に、各オプションには他のオプションよりも少なくとも優位性があります。 –

+0

@ gaga5lalaはデータテーブルに一度だけロードします – LuisC

答えて

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プラスです。

1

kaminari gemをデータページングに使用することができます。データの一部を取り、次のページへのアクセスでさらに必要とします。

Cliente.page(1).per(50) 

雷また、単にあなたがREADMEでの使用を見つけることができるヘルパー

<%= paginate @cliente %> 

を使用し、あなたのための改ページのリンクを行います。

優れたUXを実現するには、API(AJAX)でリクエストを通信し、無限スクロールなどの技術を使用する必要があります。

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 

私はより多くの投稿はありません、あなたはそれを把握することができます

は、あなたのコントローラーを変更します。 ?

  • コール/ clientesページ= 2など(インクリメントカウンタを追加する)あなたは、次の空の応答を取得するまで
  • を行います:
    • を文書負荷に、なりますAJAXフェッチイベントを追加あなたはJSONレスポンスの取得各行について、あなたはタイマーまたはループでそれを行うことが部分コード

以下、テーブルに行を追加します。しかし、これは、最初の行セット(この例では50)をロードした後にページが応答するようになり、作業中にさらに多くの行がフェッチされます。

+0

お返事ありがとうございます。このメソッドはdatatableを使用して動作しますか? – LuisC

+0

'datatable'とは何ですか?私があなたの質問に見るのは、テーブルと各行のレンダリングだけです。あなたの質問によると、これはうまくいくはずです... –

関連する問題