Class: Spree::Imports::ProcessGroupJob
- Defined in:
- app/jobs/spree/imports/process_group_job.rb
Constant Summary collapse
- ROWS_BATCH_SIZE =
Rows are loaded in slices so a large group never holds every ImportRow (and its raw CSV data) in memory for the whole job.
100
Instance Method Summary collapse
Instance Method Details
#perform(import_id, row_ids) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
# File 'app/jobs/spree/imports/process_group_job.rb', line 8 def perform(import_id, row_ids) import = Spree::Import.find(import_id) Spree::Current.store = import.store mappings = import.mappings.mapped.to_a schema_fields = import.schema_fields large = import.large_import? row_ids.each_slice(ROWS_BATCH_SIZE) do |ids| # Skip rows already completed on a prior attempt so retries don't double-process them. rows = import.rows.where(id: ids).pending_and_failed.order(:row_number).to_a # Share the already-loaded import across rows: each row's processor reads # `row.import` (store, ability, lookup cache), and without this every row # lazily loads its own Import instance and rebuilds all of that per row. rows.each { |row| row.association(:import).target = import } if large Spree::Events.disable do rows.each { |row| row.bulk_process!(mappings: mappings, schema_fields: schema_fields) } end else rows.each do |row| row.process!(mappings: mappings, schema_fields: schema_fields) end end end check_import_completion(import, large) end |