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