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 %>
答
由于material_total_weight_lbs属性是在项目和公司的has_many项目,所以你应该尝试从那里获取它。
<% @companies.each do |company| %> <td>
<%=
number_with_delimiter(
company.projects.sum(:material_total_weight_lbs)
)
%> </td> <% end %>
性能很慢,因为在每个循环中您再次使用@companies,导致执行多个查询。理想的方法是创建示波器,或者也可以使用装饰器来清除视图。
公司有很多项目。 material_total_weight_lbs是项目的一个属性。所以我总计属于某个特定公司的所有项目的所有material_total_wieght_lbs。 – JerryA