我有一个包含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