相当于DataMapper中的find_each

时间:2012-01-13 12:02:37

标签: ruby datamapper

有没有办法在 DataMapper 中执行等效的ActiveRecord#find_each

find_each将通过批量处理1000而不是将所有内容加载到内存中来迭代查询结果

2 个答案:

答案 0 :(得分:1)

我检查dm-chunked_query为@MichaelKohl建议,但我无法按照我的预期使其工作,它获得整个集合(我希望它使用OFFSET + LIMIT)。所以我写了自己的扩展,这很简单,希望它有所帮助:

class DataMapper::Collection
  def batch(n)
    Enumerator.new do |y|
      offset = 0
      loop do 
        records = slice(offset, n)
        break if records.empty?
        records.each { |record| y.yield(record) }
        offset += records.size
      end
    end
  end
end

# Example
Model.all(:order => :id.asc).batch(1000).each { |obj| p obj }

答案 1 :(得分:0)

我没有太多DM,但是编写自己的DM并不难,假设DM允许你手动对查询应用你自己的'limit'和'offset'。

查看AR中find_each / find_in_batches的实现,只有几十行。

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/batches.rb#L19

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/relation/batches.rb#L48