我有一个用ruby编写的模块,它连接到一个postgres表,然后应用一些逻辑和代码。
以下是示例代码:
module SampleModuleHelper
def self.traverse_database
ProductTable.where(:column => value).find_each do |product|
#some logic here that takes a long time
end
end
end
ProductTable拥有超过300万条记录。我使用了where子句来缩短检索的记录数。
但是我需要证明代码连接。有时连接断开,我必须从一开始就开始遍历表。我不想要这个,而是它应该从它停止的地方开始,因为每个记录花费的时间太多了。
让代码从停止的地方开始的最佳方法是什么?
一种方法是在数据库中创建一个表,记录停止的主键(id)并从那里开始。但是我不想在数据库中创建表,因为有很多这样的过程。
答案 0 :(得分:2)
您可以保留已处理记录的计数器,并使用offset
方法继续处理。
有些事情:
MAX_RETRIES = 3
def self.traverse(query)
counter = 0
retries = 0
begin
query.offset(counter).find_each do |record|
yield record
counter += 1
end
rescue ActiveRecord::ConnectionNotEstablished => e # or whatever error you're expecting
retries += 1
retry unless retries > MAX_RETRIES
raise
end
end
def self.traverse_products
traverse(ProductTable.where(column: value)) do |product|
# do something with `product`
end
end