我有一個包含500,000個條目的表A(:name, :address, :phone)
。我想運行這個查詢:批量運行rails查詢
johns = A.where(:name => "John")
這個查詢應該返回150,000個結果。但運行這個查詢給了我這個結果:Killed
。
我該如何重寫此查詢,以便查詢在數據庫中的批量爲1000的情況下運行?
我有一個包含500,000個條目的表A(:name, :address, :phone)
。我想運行這個查詢:批量運行rails查詢
johns = A.where(:name => "John")
這個查詢應該返回150,000個結果。但運行這個查詢給了我這個結果:Killed
。
我該如何重寫此查詢,以便查詢在數據庫中的批量爲1000的情況下運行?
您需要使用find_each
和選項batch_size。
A.where(:name => "John").find_each(batch_size: 1000) do |a|
# your code
end
使用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
。
A.where(:name => "John").find_each(batch_size: 1000) do |a|
# your code
end
你的代碼的解釋會更有幫助。 – serenesat
我做到了。 rake任務仍在運行。但是它在每一行的終端上都會打印以下內容。 [1432551600,1432553400,1432555200,1432557000,1432558800,1432560600,1432562400]。任何想法可能是什麼? – Hellboy
你給它打印什麼?...我認爲那些是Ruby object_id –
我什麼也沒給打印 – Hellboy