3

我有一個包含500,000個條目的表A(:name, :address, :phone)。我想運行這個查詢:批量運行rails查詢

johns = A.where(:name => "John") 

這個查詢應該返回150,000個結果。但運行這個查詢給了我這個結果:Killed

我該如何重寫此查詢,以便查詢在數據庫中的批量爲1000的情況下運行?

回答

4

您需要使用find_each和選項batch_size

A.where(:name => "John").find_each(batch_size: 1000) do |a| 
    # your code 
end 
+0

我做到了。 rake任務仍在運行。但是它在每一行的終端上都會打印以下內容。 [1432551600,1432553400,1432555200,1432557000,1432558800,1432560600,1432562400]。任何想法可能是什麼? – Hellboy

+0

你給它打印什麼?...我認爲那些是Ruby object_id –

+0

我什麼也沒給打印 – Hellboy

0

使用find_each一種替代方法是使用find_in_batches

有一個明顯的區別 - find_each會給你的塊每個項目,並會循環你的批次項目。 find_in_batches會將您的一批物品放入您的區塊。

我假設你的A模型實際上被稱爲Address。你可以做這樣的事情:

Address.where(name: "John").find_in_batches(batch_size: 1000) do |addresses| 

    # Your code that you might want to run BEFORE processing each batch ... 

    addresses.each do |address| 
    # Your code that you want to run for each address 
    end 

    # Your code that you might want to run AFTER processing each batch ... 

end 

正如你所看到的,這給了你身邊,你如何處理您的批次處理多一點靈活性。但是,如果您的需求很簡單,只需堅持find_each

0
A.where(:name => "John").find_each(batch_size: 1000) do |a| 
    # your code 
end 
+0

你的代碼的解釋會更有幫助。 – serenesat