Rails表单构建器 - 如何提高性能

时间:2013-05-27 15:24:20

标签: ruby-on-rails-3 performance forms

我有一个页面有几种形式,表单和字段的加载时间似乎比它应该慢。

我的表单看起来像这样

-@leaders = Leader.select("id, full_name")
-@managers = Leader.select("id, full_name")

=form_for organization, remote: true do |f|
  =f.fields_for :projects, [project] do |project_fields|
    Status:
    =project_fields.collection_select :status_id, Status.all, :id, :title

    Current Manager
    =project_fields.fields_for :project_managers, [pm] do |project_manager_fields|
      -# 50+ entries          
      =project_manager_fields.collection_select :manager_id, @managers, :id, :full_name

    Current Lead
    =project_fields.fields_for :project_leads, [pl]  do |project_lead_fields|
      -# 50+ entries
      =project_lead_fields.collection_select :lead_id, @leaders, :id, :full_name

这只是一个人为的例子。我已预先加载所有内容,因此fields_for不会访问数据库。这产生了巨大的差异,但仍然太慢了。我也尝试缓存每个内容,使速度可以接受,但我不认为缓存是预期的解决方案。

我还能做些什么来让它更快地渲染?

ruby​​ 1.9.2或1.9.3,Rails 3.2.6,sqlserver适配器(一切都比mysql慢),Ubuntu 10.04 VM(托管在windows 2k3中),4gb,3ghz xeon cpu

这在杂货/乘客的开发和生产上很慢,其他页面加载速度可以接受。

3 个答案:

答案 0 :(得分:2)

最近,在优化Rails应用程序性能时,我发现一些Rails表单助手的速度非常慢。通过用原始字符串插值替换表单辅助调用,我能够将几个频繁使用的页面的渲染速度相乘。

要获取助手生成的HTML,请在Chrome中打开页面,按F12打开开发工具,进入元素,右键单击元素,然后选择&#34;复制HTML&#34;。然后将原始HTML复制到模板中,并根据需要使用#{}字符串插值在正确的位置插入值。对于真实性令牌<input>,请使用value="#{form_authenticity_token}"

这很难看,有些人甚至可能说是丑陋的,但它也很快。通过在一些关键位置应用此更改,以及DB索引的优化和一些其他更改,我能够使上述应用程序在同一服务器上处理3.6倍的负载!

答案 1 :(得分:0)

仅使用模型的必要字段呢?

=form_for organization, remote: true do |f|
  =f.fields_for :projects, [project] do |project_fields|
    Status:
    =project_fields.collection_select :status_id, Status.find(:all,:select=>'id,title'), :id, :title

    Current Manager
    =project_fields.fields_for :project_managers, [pm] do |project_manager_fields|
      -# 50+ entries          
      =project_manager_fields.collection_select :manager_id, Manager.find(:all,:select=>'id,full_name'), :id, :full_name

    Current Lead
    =project_fields.fields_for :project_leads, [pl]  do |project_lead_fields|
      -# 50+ entries
      =project_lead_fields.collection_select :lead_id, Leader.find(:all,:select=>'id,full_name'), :id, :full_name

答案 2 :(得分:0)

看到有这么多表格,我猜这个页面本身太长了,不适合屏幕。用户肯定无法在短时间内处理如此多的信息。

那么,如果可能的话,为什么不首先加载必要的div?然后,您可以使用切换来显示Ajax需要的表单。