2012-01-13 1 views
4

ActiveRecord#find_eachに相当する方法はにありますかDataMapperDataMapperのfind_eachに相当する

find_each 1000のバッチでメモリに物事をフェッチするのではなく、メモリのすべてをロードすることによって、クエリの結果を反復処理します)

+2

ませDMの専門家が、どのようにこの外観を行います。https://github.com/postmodern/dm-chunked_queryは? –

+0

dm-chunkedは完全に機能します。ヒントをありがとう! ところで、元のポスターがあなたに信用を与えることができるように、回答としてコメントを投稿しているはずです。あなたはまだそうすることができます。 – phatmann

答えて

0

私はあまりDMはありませんが、それは難しいが、書くことということではないでしょう独自のDMでは、独自の「制限」と「オフセット」を手動でクエリに適用することができます。

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

+1

私はそれを書くことができると確信していますが、すでにそれを行う方法がある場合、私は車輪を再発明したくありません。 – mb14

1

(私はそれを使用することを期待OFFSET、それは全体のコレクションを取得し、@MichaelKohlが示唆したように、私はdm-chunked_queryをチェックしますが、私が期待するように私はそれを動作させることができませんでした+ 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 }