Class: Rimportor::ActiveRecord::Import
- Inherits:
-
Object
- Object
- Rimportor::ActiveRecord::Import
- Defined in:
- lib/rimportor/active_record/import.rb
Instance Method Summary collapse
- #exec_statement ⇒ Object
- #execute_callbacks(element, before_or_after) ⇒ Object
- #import_statement(batch) ⇒ Object
-
#initialize(bulk, adapter, opts = {}) ⇒ Import
constructor
A new instance of Import.
- #run_after_callbacks ⇒ Object
- #run_before_callbacks ⇒ Object
- #run_validations ⇒ Object
Constructor Details
#initialize(bulk, adapter, opts = {}) ⇒ Import
Returns a new instance of Import.
7 8 9 10 11 12 13 14 15 |
# 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 |
Instance Method Details
#exec_statement ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# 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.}" false end end |
#execute_callbacks(element, before_or_after) ⇒ Object
36 37 38 39 40 41 42 43 |
# 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) ⇒ Object
45 46 47 48 49 50 51 |
# 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 ⇒ Object
23 24 25 26 27 |
# 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 ⇒ Object
17 18 19 20 21 |
# 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 ⇒ Object
29 30 31 32 33 34 |
# 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 |