簡體   English   中英

Rails 4查詢性能和查詢移出視圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM