Rails 4查询性能和查询移出查看

问题描述:

我对rails的某些方面还是比较陌生,并且在我看来这样的查询确实减慢了我的响应时间。我相信一些铁轨专家可以在这一个上打我。Rails 4查询性能和查询移出查看

型号Company.rb

class Company < ActiveRecord::Base 
    has_many :contacts, inverse_of: :company 
    has_many :projects, inverse_of: :company 
end 

控制器companies_controller.rb

def index 
    @companies = Company.all.includes(:contacts, :projects) 
end 

查看index.html.rb
(编辑),我在做什么这里是从属于特定公司的所有项目中获得:material_total_weight_lbs的总和年。

<% @companies.each do |company| %> 
    <td> 
    <%= 
     number_with_delimiter(
     @companies.where(id: company.id).sum(:material_total_weight_lbs) 
    ) 
    %> 
    </td> 
<% end %> 

:material_total_weight_lbs是一个项目属性。

我的Rails服务器看起来就像这样......

... 
    (0.6ms) SELECT COUNT(*) FROM "projects" WHERE "projects"."company_id" = $1 [["company_id", 511]] 
    (0.7ms) SELECT SUM(material_total_weight_lbs) FROM "companies" LEFT OUTER JOIN "contacts" ON "contacts"."company_id" = "companies"."id" LEFT OUTER JOIN "projects" ON "projects"."company_id" = "companies"."id" WHERE "companies"."id" = $1 [["id", 511]] 
    (0.7ms) SELECT COUNT(*) FROM "projects" WHERE "projects"."company_id" = $1 [["company_id", 512]] 
    (0.8ms) SELECT SUM(material_total_weight_lbs) FROM "companies" LEFT OUTER JOIN "contacts" ON "contacts"."company_id" = "companies"."id" LEFT OUTER JOIN "projects" ON "projects"."company_id" = "companies"."id" WHERE "companies"."id" = $1 [["id", 512]] 
    (1.0ms) SELECT COUNT(*) FROM "projects" WHERE "projects"."company_id" = $1 [["company_id", 513]] 
    (1.2ms) SELECT SUM(material_total_weight_lbs) FROM "companies" LEFT OUTER JOIN "contacts" ON "contacts"."company_id" = "companies"."id" LEFT OUTER JOIN "projects" ON "projects"."company_id" = "companies"."id" WHERE "companies"."id" = $1 [["id", 513]] 
    Rendered companies/index.html.erb within layouts/application (3454.9ms) 
    (1.1ms) SELECT COUNT(*) FROM "companies" 
    (1.3ms) SELECT COUNT(*) FROM "projects" WHERE (scheduled_start_date > '2015-01-22 15:25:07.717772') 
    (1.0ms) SELECT COUNT(*) FROM "materials" 
    Rendered layouts/_navigation.html.erb (8.0ms) 
    Rendered layouts/_topnavbar.html.erb (0.1ms) 
    Rendered layouts/_footer.html.erb (0.2ms) 
Completed 200 OK in 3509ms (Views: 2664.9ms | ActiveRecord: 843.6ms) 

问题
1.什么是移动这个逻辑从视图的最佳做法?
2.如何设置此查询以获得最佳性能?

谢谢你们。

我真的不明白你要在这里做什么。

<% @companies.each do |company| %> 
    <td> 
    <%= 
     number_with_delimiter(
     @companies.where(id: company.id).sum(:material_total_weight_lbs) 
    ) 
    %> 
    </td> 
<% end %> 

我想这应该仅仅是

<% @companies.each do |company| %> 
    <td> 
    <%= 
     number_with_delimiter(
     company.material_total_weight_lbs 
    ) 
    %> 
    </td> 
<% end %> 
+0

公司有很多项目。 material_total_weight_lbs是项目的一个属性。所以我总计属于某个特定公司的所有项目的所有material_total_wieght_lbs。 – JerryA

由于material_total_weight_lbs属性是在项目和公司的has_many项目,所以你应该尝试从那里获取它。

<% @companies.each do |company| %> <td> 
    <%= 
     number_with_delimiter(
     company.projects.sum(:material_total_weight_lbs) 
    ) 
    %> </td> <% end %> 

性能很慢,因为在每个循环中您再次使用@companies,导致执行多个查询。理想的方法是创建示波器,或者也可以使用装饰器来清除视图。

+0

谢谢你的帮助。我尝试过这样做,它确实减少了加入的数量,但查询数量是相同的,花费了相同的时间。我将检查范围。 – JerryA

+0

计数查询与上面的代码无关。你可能会用在某个地方。您也可以尝试收集哪些返回收集。 –

+0

我认为最好将total_lbs_processed这样的列添加到companies表中,然后当我保存,更新或删除一个项目时,调用一个计算总数的函数:所有属于该公司的项目的material_total_weight_lbs并更新适当的列在公司的桌子上。 – JerryA