[英]Rails 4 Query Performance & Moving Queries out of View
我對Rails的某些方面比較陌生,並且在我看來有一個查詢確實拖慢了我的響應時間。 我敢肯定,一些Rails專家可以幫我一巴掌。
模型公司
class Company < ActiveRecord::Base
has_many :contacts, inverse_of: :company
has_many :projects, inverse_of: :company
end
控制器公司_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,從而導致執行多個查詢。 理想的方法是創建范圍,也可以使用裝飾器清除視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.