我基本上有一个Document模型,其中有很多页面,我有一个视图,我需要枚举一堆文档(例如300)并为每个页面制作一个按钮。 (我想使用DataTables jQuery插件进行分页客户端,以便表可以排序和搜索)。问题是,如果我尝试枚举每个文档中每个页面的所有按钮,则渲染时间超过10秒,这是无用的。
有没有'技巧'来快速进行这种嵌套集合渲染?我应该只为每个文档缓存片段(一旦创建它们就不会改变很多)?或者这对于Rails partials来说只是一个糟糕的情况,我最好的办法是在DataTables中做一些客户端渲染作为分页的一部分吗?
编辑:我已经包含了关联,因此我没有N + 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回调中静态生成整个呈现的页面。然后只为后续请求提供该单个文件。
虽然如果对更传统的缓存收费并不是一个巨大的不便,这可能比它的价值更麻烦。