diff --git a/lib/excelsior/import.rb b/lib/excelsior/import.rb index c00202ad7f224aa0ea8637f1e8444f8448712e71..cd81e3e479b4847c68ef8fdbcbd9f1304af5b39e 100644 --- a/lib/excelsior/import.rb +++ b/lib/excelsior/import.rb @@ -30,19 +30,15 @@ module Excelsior @rows = @sheet.rows @result = Result.new(@rows.length) - - validate! end def run(&block) - return unless valid? + check_columns! - if self.class.use_transaction - model_class.transaction do - insert_rows(&block) + return if result.failed? - raise ActiveRecord::Rollback if report.failed.positive? - end + if self.class.use_transaction + run_with_transaction(&block) else insert_rows(&block) end @@ -50,20 +46,24 @@ module Excelsior result end - def validate! + private + + def check_columns! fields.to_a.each do |f| errors[:missing_column] << { missing: f[:header] } unless @columns.include?(f[:header]) end end - def valid? - result.status != Result::Statuses::FAILED + def model_class + self.class.name.gsub('Import', '').constantize end - private + def run_with_transaction(&block) + model_class.transaction do + insert_rows(&block) - def model_class - self.class.name.gsub('Import', '').constantize + raise ActiveRecord::Rollback if report.failed.positive? + end end def add_model_errors(record, index) diff --git a/lib/excelsior/result.rb b/lib/excelsior/result.rb index 441d2eba6d5affe1dd2e0156d9a324813673291f..c0ff721ec8f61c1189b2b463e6b6564566aa1407 100644 --- a/lib/excelsior/result.rb +++ b/lib/excelsior/result.rb @@ -27,5 +27,9 @@ module Excelsior Statuses::PENDING end end + + def failed? + status == Result::Statuses::FAILED + end end end diff --git a/test/excelsior_test.rb b/test/excelsior_test.rb index 63bf210e49eaf8112a71614f790b5dc3767abe12..c9e3d6f62feba2de53be9069de69ca7377922df1 100644 --- a/test/excelsior_test.rb +++ b/test/excelsior_test.rb @@ -167,7 +167,7 @@ describe Excelsior do describe '#errors' do it 'returns an error when a column is missing in the excel' do - import = UserImport.new('test/files/missing-column.xlsx') + import = UserImport.new('test/files/missing-column.xlsx').tap(&:run) assert import.errors[:missing_column].any? end