我正在使用此搜索构建一个RoR(rails 4)项目,并在带有bootstrap 3样式的表中显示。
我在RoR中很新,我的英语不好。对此我很抱歉。 请帮我!并感谢你的一切!
<div class="panel panel-primary">
<div class="panel-body">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>Grado</th>
<% meses = ((@cargo_total_grado.fecha_inicio)..@cargo_total_grado.fecha_final).map {|d| [d.strftime('%b'), d.year]}.uniq %>
<% meses.each do |m| %>
<th> <%= m.first + " " + m.second.to_s %> </th>
<% end %>
<th>Total</th>
</tr>
</thead>
<tbody>
<% @cursos.each do |curso| %>
<% alumnos = Alumno.select("id").where(:id => curso.alumno_ids) %>
<tr>
<td><small><%= curso.id_curso %></small></td>
<% total = 0 %>
<% meses.each do |m| %>
<% inicio = (m.second.to_s + m.first.to_s + "-01").to_date %>
<% final = inicio.next_month %>
<% mes = alumnos.map { |e| e.planes.map {|r| r.cargos.where("fecha_cargo >= ? AND fecha_cargo < ?", inicio, final).sum(:monto)}.sum }.sum %>
<% total += mes %>
<td><small> <%= number_to_currency(mes) %> </small></td>
<% end %>
<th><small><%= number_to_currency(total) %></small></th>
</tr>
<% end %>
<tr>
<th></th>
<% totales = 0 %>
<% meses.each do |m| %>
<% inicio = (m.second.to_s + m.first.to_s + "-01").to_date %>
<% final = inicio.next_month %>
<% mes_total = @cursos.map { |c| c.alumnos.map { |e| e.planes.map {|r| r.cargos.where("fecha_cargo >= ? AND fecha_cargo < ?", inicio, final).sum(:monto)}.sum }.sum }.sum %>
<% totales += mes_total %>
<th><small> <%= number_to_currency(mes_total) %> </small></th>
<% end %>
<th><small><%= number_to_currency(totales) %></small></th>
</tr>
</tbody>
</table>
</br>
</div>
答案 0 :(得分:3)
所以你的问题是你有太多的SQL调用。 Rails需要在数据库中查询每个导致速度减慢的数据库。
您应该查看Eager Loading以解决此问题,通常称为 N + 1查询问题。
Active Record允许您事先指定要加载的所有关联。这可以通过指定Model.find调用的includes方法来实现。使用includes,Active Record可确保使用尽可能少的查询加载所有指定的关联。
例如,您似乎正在将多个课程加载到@cursos
对象中,并从中加载多个Alumno
对象,然后加载那些加载Cargo
个对象。这将导致多次调用数据库。在您的模型中,您可以执行以下操作:
@cursos = Curso.includes(alumnos: [:cargos]).all
对于答案的第二部分,是否可以显示加载动画:
是的,你可以,但是你必须使用AJAX调用才能从你创建的其他路由中加载返回所需信息的信息。它不是太复杂,但确实给应用程序增加了一些复杂性。 Take a look at this if you're interested
P.S。 Parece quehablasespañol? Si hay algo que no entiendespuedoexplicártelopochat,solo me avisas cuando tengas tiempo。
答案 1 :(得分:0)
为了获得更多优化结果,您可以使用弹性搜索。