ActiveRecord find_each combined with limit and order

后端 未结 13 2133
温柔的废话
温柔的废话 2020-12-02 11:41

I\'m trying to run a query of about 50,000 records using ActiveRecord\'s find_each method, but it seems to be ignoring my other parameters like so:



        
13条回答
  •  难免孤独
    2020-12-02 12:23

    Using Kaminari or something other it will be easy.

    Create batch loader class.

    module BatchLoader
      extend ActiveSupport::Concern
    
      def batch_by_page(options = {})
        options = init_batch_options!(options)
    
        next_page = 1
    
        loop do
          next_page = yield(next_page, options[:batch_size])
    
          break next_page if next_page.nil?
        end
      end
    
      private
    
      def default_batch_options
        {
          batch_size: 50
        }
      end
    
      def init_batch_options!(options)
        options ||= {}
        default_batch_options.merge!(options)
      end
    end
    

    Create Repository

    class ThingRepository
      include BatchLoader
    
      # @param [Integer] per_page
      # @param [Proc] block
      def batch_changes(per_page=100, &block)
        relation = Thing.active.order("created_at DESC")
    
        batch_by_page do |next_page|
          query = relation.page(next_page).per(per_page)
          yield query if block_given?
          query.next_page
        end
      end
    end
    

    Use the repository

    repo = ThingRepository.new
    repo.batch_changes(5000).each do |g|
      g.each do |t|
        #...
      end
    end
    

提交回复
热议问题