Rails部分枚举关联非常慢

时间:2013-04-23 20:38:51

标签: ruby-on-rails performance partial-views

我基本上有一个Document模型,其中有很多页面,我有一个视图,我需要枚举一堆文档(例如300)并为每个页面制作一个按钮。 (我想使用DataTables jQuery插件进行分页客户端,以便表可以排序和搜索)。问题是,如果我尝试枚举每个文档中每个页面的所有按钮,则渲染时间超过10秒,这是无用的。

有没有'技巧'来快速进行这种嵌套集合渲染?我应该只为每个文档缓存片段(一旦创建它们就不会改变很多)?或者这对于Rails partials来说只是一个糟糕的情况,我最好的办法是在DataTables中做一些客户端渲染作为分页的一部分吗?

编辑:我已经包含了关联,因此我没有N + 1查询问题,这不是问题。我尝试了缓存,现在看来这可能是我的解决方案,因为这个索引页面经常在每个添加的文档之间重新加载,所以它永远不必重建所有部分的完整缓存。

1 个答案:

答案 0 :(得分:0)

对缓存的迫切需求似乎是一种代码味道。代替猜测,你尝试过分析吗? (例如http://hiltmon.com/blog/2012/02/27/quick-and-dirty-rails-performance-profiling/

gem 'ruby-prof'

定义探查器:

# /lib/development_profiler.rb

class DevelopmentProfiler
  def self.prof(file_name)

    RubyProf.start
    yield
    results = RubyProf.stop

    # Print a flat profile to text
    File.open "#{Rails.root}/tmp/performance/#{file_name}-graph.html", 'w' do |file|
      RubyProf::GraphHtmlPrinter.new(results).print(file)
    end

    File.open "#{Rails.root}/tmp/performance/#{file_name}-flat.txt", 'w' do |file|
      # RubyProf::FlatPrinter.new(results).print(file)
      RubyProf::FlatPrinterWithLineNumbers.new(results).print(file)
    end

    File.open "#{Rails.root}/tmp/performance/#{file_name}-stack.html", 'w' do |file|
      RubyProf::CallStackPrinter.new(results).print(file)
    end
  end
end

用...包裹您的视图逻辑

DevelopmentProfiler::prof("render-profiling") do
  # Your slow code here
end

编辑 - 另外一个想法:由于您的模型数据不太可能发生变化,因此最好只吃一次渲染成本。您可以在after_save回调中静态生成整个呈现的页面。然后只为后续请求提供该单个文件。

虽然如果对更传统的缓存收费并不是一个巨大的不便,这可能比它的价值更麻烦。