class Rimportor::ActiveRecord::Import
Public Class Methods
new(bulk, adapter, opts = {})
click to toggle source
# File lib/rimportor/active_record/import.rb, line 7 def initialize(bulk, adapter, opts = {}) @bulk = bulk @adapter = adapter @before_callbacks = !!opts[:before_callbacks] @after_callbacks = !!opts[:after_callbacks] @validate_bulk = !!opts[:validate_bulk] @batch_size = opts[:batch_size] ? opts[:batch_size] : 1000 @threads = Rimportor.configuration.threads end
Public Instance Methods
exec_statement()
click to toggle source
# File lib/rimportor/active_record/import.rb, line 53 def exec_statement begin run_validations if @validate_bulk run_before_callbacks if @before_callbacks @bulk.each_slice(@batch_size) do |batch| @adapter.exec_insert(import_statement(batch)) end run_after_callbacks if @after_callbacks true rescue => e puts "Error importing the bulk. Reason #{e.message}" false end end
execute_callbacks(element, before_or_after)
click to toggle source
# File lib/rimportor/active_record/import.rb, line 36 def execute_callbacks(element, before_or_after) case before_or_after when :before element.run_callbacks(:save) { false } when :after element.run_callbacks(:save) { true } end end
import_statement(batch)
click to toggle source
# File lib/rimportor/active_record/import.rb, line 45 def import_statement(batch) insert_statement = SqlBuilder.new(batch.first).full_insert_statement result = ::Parallel.map(batch.drop(1), in_threads: @threads) do |element| @adapter.exec_in_pool { SqlBuilder.new(element).partial_insert_statement.gsub('VALUES', '') } end [insert_statement, result] end
run_after_callbacks()
click to toggle source
# File lib/rimportor/active_record/import.rb, line 23 def run_after_callbacks ::Parallel.map(@bulk, in_threads: @threads) do |element| execute_callbacks(element, :after) end end
run_before_callbacks()
click to toggle source
# File lib/rimportor/active_record/import.rb, line 17 def run_before_callbacks ::Parallel.map(@bulk, in_threads: @threads) do |element| execute_callbacks(element, :before) end end
run_validations()
click to toggle source
# File lib/rimportor/active_record/import.rb, line 29 def run_validations validation_result = ::Parallel.map(@bulk, in_threads: @threads) do |element| element.valid? end.all? raise Rimportor::Error::BulkValidation.new("Your bulk is not valid") unless validation_result end