使用find_in_batches时如何确保正确性?

时间:2014-01-21 07:56:21

标签: ruby-on-rails ruby batch-processing

目前我的申请有统计需求,我

使用rufus-scheduler编写后台作业,并在3:00运行

将这些记录批量处理到CacheStat表中。这就像

任何正常申请的每周/每月统计需求。

我发现使用了find_each(比如使用User.find_each进行迭代 所有用户),调用find_in_batches,我签出源代码 铁路,

   while records.any?
    records_size = records.size
    primary_key_offset = records.last.id

    yield records

    break if records_size < batch_size

    if primary_key_offset
      records = relation.where(table[primary_key].gt(primary_key_offset)).to_a
    else
      raise "Primary key not included in the custom select clause"
    end
  end

实现是通过比较主键, 我关心的是货币,当我处理批次时, 有些记录插入其中吗? 有没有人有这种问题?

虽然我认为这个代码实现可能有问题,

因为新记录总是会有更大的PK,后来会在

将会找到。

这就是实现这种需求的原因吗?如果我想

自己实现批量统计处理(没有rails),然后我

需要确保有一个整数主键并使用这些字段

比较(最好不要使用其他类型的字段)?

(我正在考虑这个,因为我正处于切换的过程中

从mysql到mongo,所以也许以后我需要实现这种

我自己的功能。)

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您可以通过强制执行transactional isolation来确保正确性,例如

User.transaction do
  User.find_each do |user|
    user
  end
end