在某些情況下,當我得到一個ActiveRecord的關係,我在一個ActiveRecord遇到奇怪的行爲與.each
::關係Rails的活動記錄關係枚舉
這似乎是在ActiveRecord的::關係代表:each
到:to => :to_a
( source)
@tasks = Task.find_task(list, {:week_id => 1})
基本上,有一個長的類方法,它採用一個對象(list
,並用:week_id
散列)
過濾一束&查詢發生這種find_task
方法中,但它最終返回一個關係到@tasks
然後,在模板中,我有:
<% @tasks.each do |task| %>
.
.
.
<% end %>
無論出於何種原因,無論是大小爲@tasks
,大約需要3分鐘。我可以通過調用@tasks.to_a
來複制相同的行爲即使@tasks
,ActiveRecord :: Relation的實例只有兩條記錄,在它們上調用to_a
需要> 3分鐘。
它不會發生在所有:week_id
S,只能在特定的week_id,例如::week_id => 1
的SQL執行罰款,我得到一個關係回來,它只是似乎是一個枚舉上一個問題特定的ActiveRecord ::關係。
更新
算法(我認爲這意味着類方法),我做的預先加載的裏面很多。所以Postgres做了很多LEFT OUTER JOIN
s,我已經索引了所有需要發生的表。
一個解釋分析顯示,所有掃描都是index scans
,事實證明,查詢執行得很好,有很多急切的加載......並且我得到一個渴望加載的'ActiveRecord :: Relation'回到合理的數量時間。
更新2 雖然這個過程是服用3分鐘,我看到了幾秒鐘一個Postgres處理運行,然後我看到這3分鐘我的輸出top
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8685 dylan 20 0 3407m 2.6g 904 R 99.7 69.1 1:14.49 /usr/local/bin/ruby script/rails s
當它終於結束時,服務器顯示這個;
- 預先加載:
200 ms
,139 ms
然後 - 大的SQL查詢,有很多
LEFT OUTER JOINS in 33,000 ms
,(長,但不是其中大部分是),那麼 - 模板
257,000 ms
。
當我複製模板的行爲我看到它大約需要3-4分鐘撥打to_a
在@tasks
關係。
所以,當我的服務器告訴我所有的時間都花在模板上,而且我可以看到調用一個關於enumerable的關係需要永遠的時間,是當查詢被執行時?儘管在top
我只能看到ruby
進程正在運行?