在我的Rails應用程序中,我有一個引用其他幾個對象的TimeEntry
模型。下面是遷移:如何加快此查詢/頁面?
class CreateTimeEntries < ActiveRecord::Migration[5.0]
def change
create_table :time_entries do |t|
t.references :user, foreign_key: true
t.references :customer, foreign_key: true
t.references :site, foreign_key: true
t.date :work_date
t.integer :hours
t.integer :minutes
t.references :service, foreign_key: true
t.references :task, foreign_key: true
t.timestamps
end
end
end
我已經把需要從User
,Site
和Task
關聯領域的報告,使用此代碼:
@time_entries = TimeEntry.joins(:customer, :site)
.where('time_entries.work_date >= ? AND time_entries.work_date <= ?', @start_date, @end_date)
.where(customer: @customer)
注:@customer
在加載before_action
,可以是單個客戶,也可以是所有300+客戶
在我看來,客戶在按名稱控制器一起:
@time_entry_customers = @time_entries.group_by { |time| time.customer.name }
性能如下: Completed 200 OK in 12308ms (Views: 8508.7ms | ActiveRecord: 924.5ms)
因此,查詢的不是速度極快,但視圖是真正的問題。我做更多的分組視圖,通過客戶的網站:
<% @time_entry_customers.each do |customer, time| %>
<tr class="success">
<td colspan="6">
<strong><i class="fa fa-user"></i> <%= customer %></strong>
</td>
</tr>
<% time.group_by { |t| t.site.url }.each do |site, time_entries| %>
<tr>
<td></td>
<td class="site-row" colspan="5"><i class="fa fa-globe"></i> <%= site %></td>
</tr>
<% time_entries.each do |time_entry| %>
<tr>
<td colspan="2"></td>
<td><%= time_entry.work_date %></td>
<td><%= time_entry.try(:user).try(:full_name) %></td>
<td><%= time_entry.task.name %></td>
<td><%= time_entry.hours %> : <%= time_entry.minutes %></td>
</tr>
<% end %>
<tr>
<td></td>
<td class="info" colspan="4"><i class="fa fa-clock-o"></i> Total Time for <%= site %></td>
<td class="info"><%= sum_time_entries_as_hours_and_minutes(time_entries) %></td>
</tr>
<% end %>
<% end %>
控制器和視圖之間,這最終被成千上萬的查詢(有〜47000 TimeEntries
和〜400 Customers
)
如何我可以重構這個表現嗎?
除users.email
以外,沒有任何數據庫表具有任何索引。