有没有办法在 DataMapper 中执行等效的ActiveRecord#find_each
?
(find_each
将通过批量处理1000而不是将所有内容加载到内存中来迭代查询结果
答案 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