Эквивалент find_each в DataMapper - PullRequest
       6

Эквивалент find_each в DataMapper

4 голосов
/ 13 января 2012

Есть ли способ сделать эквивалент ActiveRecord#find_each в DataMapper ?

(find_each будет выполнять итерацию по результату запроса, выбирая вещи в памяти с помощью пакета из1000 вместо загрузки всего в память)

Ответы [ 2 ]

1 голос
/ 07 августа 2013

Я проверил 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 }
0 голосов
/ 13 января 2012

Я не много DM, но написать свой собственный не так уж и сложно, при условии, что DM позволяет вам применять свои собственные ограничения и смещения вручную к запросам.

Проверьте реализацию find_each / find_in_batches в AR, всего пара десятков строк.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...