Ruby on Rails:替代嵌套的部分(速度太慢)

时间:2014-12-16 15:51:11

标签: ruby-on-rails

我需要我的Rails应用程序来生成大表(大约5-7列,大约2000-3000行),它用于公司内部使用,所以我们不关心流量等等。

正在显示的对象的结构应该非常灵活:当添加/更改/删除某些列时,它只在一个地方(除了修改数据库模式之外)和所有视图(索引,显示,编辑表单)进行更改)自动更新。

我以前完全没有Rails的经验。我把偏序作为重用代码的一种方式(这是好事),因此,我在使用嵌套的子子部分时没有看到任何坏处。说,我有几个模型,index每个模型render的通用部分gen_index,并且对于表格的每个单元格都有特殊的部分gen_field_view

gen_field_view视图呈现相同的部分show,因此,我真的希望将其作为部分视图。

如果我只有600行和5列,则此部分会呈现3000次。这对我来说是一个巨大的惊喜,Rails很难:它目前需要大约7秒才能生成页面。如果我删除gen_field_view部分并将其直接包含在gen_index部分中,则大约需要3秒钟:速度提高两倍以上(无论如何这都很慢,但这是不同的故事)。

看来,我们应该避免这种情况的嵌套部分,但是,我们还应该使用什么来重用视图代码?

我们可能会从模型中的某个方法返回html代码,但它实际上会杀死Rails的想法,毕竟它不方便。

2 个答案:

答案 0 :(得分:1)

使用缓存策略怎么样?您可以使用rail's fragment cashing feature

<% Product.all.each do |p| %>
  <% cache(p) do %>
    <%= render partial: 'some_partial', locals: {product: p} %>
  <% end %>
<% end %>

答案 1 :(得分:0)

您可以尝试的一些事情是

  • Caching主要部分结果,在记录未更新时将重复使用
  • 在页面上将记录渲染为json并渲染表格行的模板,然后使用javascript渲染实际表格

    <div id="data" data-records="<%= @products.to_json %>"></div>
    
    <script>
    jQuery.each(jQuery("#data").data("records"), function(record) {
      jQuery("<li>").text(record.title).appendTo("#my-table")
    })
    </script>
    
  • 使用will_paginate等宝石分页,然后同时减少页面上显示的记录数量
  • 使用将html呈现为字符串

    的演示文稿对象
    class ModelPresentation
      def initialize(model)
        @model = model
      end
    
      def render
        [title, rate].join
      end
    
      def title
        "<h3>@model.title</h3>"
      end
    
      def rates
        "<span>Rate #{@model.score}</span>"
      end
    end