Ruby on rails RubyonRails:嵌套部分(速度太慢)的替代方案

Ruby on rails RubyonRails:嵌套部分(速度太慢)的替代方案,ruby-on-rails,Ruby On Rails,我需要我的Rails应用程序生成巨大的表(大约5-7列,大约2000-3000行),它是供公司内部使用的,所以我们不关心流量等等 显示的对象的结构应该非常灵活:当某些列被添加/更改/删除时,它只在一个位置被更改(除了修改db模式),所有视图(索引、显示、编辑表单)都会自动更新 我以前在Rails方面完全没有经验。我将部分作为重用代码的一种方式(这是一件好事),因此,我认为使用嵌套子部分并没有什么不好的地方。比如说,我有几个模型,index每个模型的视图renders generic partia

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

显示的对象的结构应该非常灵活:当某些列被添加/更改/删除时,它只在一个位置被更改(除了修改db模式),所有视图(索引、显示、编辑表单)都会自动更新

我以前在Rails方面完全没有经验。我将部分作为重用代码的一种方式(这是一件好事),因此,我认为使用嵌套子部分并没有什么不好的地方。比如说,我有几个模型,
index
每个模型的视图
render
s generic partial
gen\u index
,表的每个单元格都有特殊的partial
gen\u field\u视图

相同的部分
gen\u field\u视图
是从
show
视图中呈现的,因此,我非常希望将其作为一个部分

如果我只有600行和5列,这个部分会被渲染3000次。这对我来说是一个巨大的惊喜,因为Rails非常困难:目前生成页面大约需要7秒。如果我删除
gen\u field\u view
partial并将其直接包含到
gen\u index
partial中,大约需要3秒钟:快了两倍多(虽然速度很慢,但情况不同)

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


我们可能可以从模型中的某个方法返回html代码,但它实际上扼杀了Rails的概念,而且,毕竟这并不方便。

使用缓存策略怎么样?您可以使用:


您可以尝试的一些方法是

  • 当记录未更新时,将重用的主要部分结果
  • 在页面上将记录呈现为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>
    
    
    每个(jQuery(“#数据”)。数据(“记录”),函数(记录){
    jQuery(“
  • ”).text(record.title).appendTo(“#我的表”) })
  • 使用类似gem的分页,然后同时减少页面上显示的记录数量
  • 使用将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
    
    类模型演示
    def初始化(模型)
    @模型
    结束
    def渲染
    [title,rate]。加入
    结束
    def标题
    “@model.title”
    结束
    def费率
    “速率#{@model.score}”
    结束
    结束
    

有一个gem可以做到这一点:既然gem集成在rails 4中,为什么要使用它呢(请参阅)?另外,这个gem看起来不再被维护了()@DimitriJorge因为某种原因,有了
缓存
你建议它甚至比没有它需要更长的时间:没有缓存:
在7666ms内完成200ok(视图:7458.6ms | ActiveRecord:202.6ms)
,有缓存:
在8135ms内完成200ok(视图:7917.0ms | ActiveRecord:212.3ms)
第一次渲染应该需要更长的时间是的,但从理论上讲,下面的渲染应该要快得多。下面的渲染需要
7697ms
,这仍然比完全没有缓存时慢一点。如果您正在开发中,然后检查生产过程中的速度——在开发过程中,rails会更多地检查各部分是否已更改disk@FrederickCheung你说得对,在生产中,它的工作速度大约快2-3倍。但即使这样,如果我删除部分并直接包含它,差异大约是2倍。我对Rails中partials的缓慢感到非常失望。
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